Knihovna se neustále vyvíjí, aktuální informace
najdete na webu dibiphp.com.
Zkusil jsem do dibi přidat takovou hračku:
/*
CREATE TABLE [albums] (
[id] INTEGER NOT NULL PRIMARY KEY,
[artist] VARCHAR(100) NOT NULL,
[title] VARCHAR(100) NOT NULL)
*/
class Albums extends DibiTable
{
}
Třída Albums
reprezentuje databázovou tabulku (pokud jméno
tabulky neurčíme, bude se detekovat z názvu třídy). Nad ní můžeme
vykonávat třeba tyto operace:
$albums = new Albums;
// přečtení jednoho záznamu podle primárního klíče:
$key = 5;
$data = $albums->fetch($key);
// smazání záznamu č. 7
$albums->delete(7);
// smazání více záznamů
$count = $albums->delete(array(1, 2, 4));
// úprava záznamu č. 4
$data->title = 'new title';
$albums->update(4, $data);
// obdobně jako u delete lze měnit více záznamů
// vložení záznamu
$id = $albums->insert($data);
Dále lze provádět jednoduché výběry:
// řádky s klíčem 2, 3 a 5
foreach ($albums->find(2, 3, 5) as $row) {
...
}
// vypiš celou tabulku v HTML
$albums->findAll()->dump();
// výběr s řazením podle artist, title
$albums->findAll('artist', 'title');
Jde o velmi jednoduchého pomocníka (tzv. helper) pro rutinní operace nad tabulkou. Tedy žádné složité ORM nebo ActiveRecords. Tuším se tomu říká Table Data Gateway. Funkce je čerstvá a ve stádiu experimentování.
Ještě drobnost. Dibi je už ze své podstaty zcela imunní vůči SQL injection, takže se jich nemusíte obávat:
$key = '3 OR 1=1'; // podvrh
$albums->delete($key);
// --> DELETE FROM [albums] WHERE [product_id] = 3
Komentáře
Jiří Knesl #1
Pekne. :)
Dibi ma nabehnuto na to stat se taky ORM. I to ikdyz o to treba nestojis. :)
johno #2
Ano, ano. Uz sa zaciname blizit.
finc #3
A ja si porad myslel, ze ORM nemas rad :)
Je to prvni krok k dalsimu rozsireni. Samozrejme je to pouzitelne pro mensi operace, spis bych to videl jako vrstvu na akcni dotazy (insert, update, detele). Kazdy, kdo nepouziva ORM vi, jake je to otravne skladat dane SQL dotazy.
Az doplnis metadata pro jednotlive sloupce, pridas vazby 1:1, 1:N, N:M, tak to bude takovy Hibernate v PHP ;) Dost prijemna je i Criteria API z Hibernate, ktere jsou pro dynamicke dotazy skutecne vyborne. Implementace takovych veci by mozna zmenilo vetsinovy nazor na ORM..
Jeste se zeptam, jak je to s transakcema v DIBI? Jsem schopen nejak delat atomicke operace pres nekolik dotazu?
Finwe #4
No dobré! To je přesně ten drobný krok od Zend_Db_Table k dibi, který jsem potřeboval :)
#3 finci, Ad transakce: myslíš
?
veena #5
Supr, že to bereš z z CREATE TABLE. Lepší než xml nebo i yaml.
finc #6
#4 Finwe,
Nene, mam na mysli napr. pres nekolik metod.
Pr.: Budu mit tridu
class UzivatelAction {
private Dibi dibi;
// nejake oznaceni, ze dibi se zde ma pouzit v transakci
}
Pote jde o to, ze dane akce muzu mit rozdelene do nekolika metod, kde provedu akcni dotazy. Pokud by metoda skoncila na exception (nemusi to byt jen z duvodu pri akcnim dotazu), tak by se dotaz neprovedl. Ale nevim, zda neco takoveho by slo zaridit :)
enoice #7
Moc, moc pěkné.
Ještě jen malou poznámku k ukázce kódu, jen jsem si myslel že by bylo lepší kdyby tady
a tady
byl pouzit stejny
$key
, jen pro logiku update… Ne?Keff #8
#3 finci, A kdyz uz jsem si takovy ORM s vazbama v PHP napsal tak jsem king, nebo jen delam to co 10000 lidi prede mnou? Jen abych vedel jaky ramena mam delat :))
David Grudl #9
#5 veeno, to je skutečně jednoduchý helper, o struktuře tabulky nemá ani páru. Ale správně naznačuješ – implementaci je nejelegantnější řešit přes (snadnou) analýzu CREATE TABLE, než zavádět další jazyk a další duplicitní informace.
#6 finci, šlo, jen místo třídy dibi, což je „monostate“, se bude předávat objekt DibiConnection, který má stejný interface, pouze metody nejsou statické.
#1 Jiří Knesle, #2 johno #3 finc 🙂
Budu se opakovat, ale prostě ORM jsem si v roce 2003 napsal, jmenovalo se to x.query a byl to perfektní odrazový můstek zpátky k SQL… Od té doby hledám kompromis.
MiSHAK #10
Použít u delete pole pro zápis více argumentů a u find prostě více argumentu za sebou je trochu matoucí 😉.
Ale díky díky díky všemocný :)
veena #11
#8 Keffe, Dobrý. Najdem to někde jako open source?
Keff #12
#11 veeno, To ne – what baketh in da house, stayeth in da house :) a navic to jeste dlouho potrva nez to bude v kvalite co by ustala release…
Milan Svoboda #13
Jde v tomto dibitable nějak udělat, když potřebuji udělat select přes vícero tabulek?
v6ak #14
Na dibi je hlavně škoda, že nemám instance třídy, ale volám staticky. V praxi tedy používám PDO.
David Grudl #15
#14 v6aku, samozřejmě že má. Celé je postavené na instancích, pouze jedna třída
dibi
je statická, která kopíruje interfaceDibiConnection
a není nutné ji vůbec používat.Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.