Základní informace
- Vrstva pro práci s databází v PHP nad PDO
- Testováno s MySQL, SQLite, PostgreSQL, MS SQL, Oracle
- Open-source
- Odvozené dílo je součástí Nette Framework
Ukázka syntaxe
$application = $db->application[3]
SELECT * FROM application WHERE id = 3
$application = $db->author[array("name" => "X")]
SELECT * FROM author WHERE name = 'X'
foreach ($db->application()->order("title") as $application)
SELECT * FROM application ORDER BY title
$application["title"]
$application->author["name"]
SELECT * FROM author WHERE id IN (?, ?, ?)
author.name
$db->application()->where("author.name LIKE ?", $name)
SELECT application.* FROM application LEFT JOIN author ON application.author_id = author.id WHERE author.name LIKE ?
$db->author()->min("born")
SELECT MIN(born) FROM author
$application->application_tag()->count("*")
SELECT application_id, COUNT(*) FROM application_tag WHERE application_id IN (?, ?, ?) GROUP BY application_id
Názvy tabulek a sloupců
- Je vhodné dodržovat jakoukoliv konvenci (lze definovat)
- Výchozí konvence: primární klíč
table.id
, cizí klíč table_id
- Jinak lze strukturu popsat v objektu nebo zjistit z meta-informací
Výkonnost
- Konstantní počet dotazů
- Přenáší se minimální objem dat v pevném počtu dotazů
- Asymptoticky optimální
- MySQL query cache friendly
- MySQL maže keš všech dotazů pracujících se změněnou tabulkou
- Automatický výběr přenášených sloupců
$db = new NotORM($pdo, $structure, $cache)
echo "$application[id]: $application[name]\n"
SELECT id, name FROM application
- Výsledky se celé ukládají do paměti
- Extrémně velké dotazy je lepší zpracovat po částech:
$table->limit(1000)
Ukázka ukládání dat
$application = $db->application()->insert(array("title" => "X"))
INSERT INTO application (title) VALUES ('X')
$application->application_tag()->insert(array("tag_id" => 11))
INSERT INTO application_tag (application_id, tag_id) VALUES (?, 11)
$db->application()->update(array("title" => "X"))
UPDATE application SET title = 'X'
$db->application()->delete()
$application->update(array("title" => "X"))
UPDATE application SET title = 'X' WHERE id = ?
$application->delete()
DELETE FROM application WHERE id = ?
Bezpečnost
- Všechna data jsou automaticky ošetřena
- Pro zápis výrazů slouží objekt
NotORM_Literal
- Identifikátory (tabulky a sloupce) se neošetřují
Rozšiřitelnost
- Třídu
NotORM_Row
lze zdědit
- Použitelné např. pro jazykové verze
$tag["name_"]
přepíšeme na $tag["name_$lang"]
Ošetřování chyb
- NotORM neeskaluje chyby
- Neexistující sloupec vyvolá
E_NOTICE
- Chybný dotaz závisí na nastavení PDO
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
- Pro ladění lze použít chybový výstup nebo callback
$db->debug = function ($query, $parameters) {}
Integrace do MVC aplikace
- Vlastní výjimky –
ModelException
, DuplicateException
BaseModel::initialize($pdo)
BaseModel::getOne($table, $id)
Application::allWithTag($tag)
Application::hasTag($application, $tag)
Application::insert($data)
Závěr
- Extrémně pohodlná syntaxe
- Záruka výkonnosti (při správném návrhu databáze)
- Bezpečnost, rozšiřitelnost