tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

DibiTable a fetch

před 11 lety

dmajda
Člen | 22

Ve třídě DibiResult vidím hezké metody pro vytažení výsledků: fetch, fetchAll, fetchAssoc, fetchPairs, fetchSingle.

Ve třídě DibiFluent vidím ty samé hezké metody.

Ve třídě DibiTable vidím ale metodu fetch použitou k něčemu trochu jinému (bere také jiné parametry než ostatní metody fetch) a další fetchovací metody chybí. Na druhou stranu lze přes __call volat fetch[All]ByKdesiCosi. Jako uživateli mi to celé přijde dost nekonzistentní a při pronikání do dibi mě to dost mátlo, zvlášť když má DibiTable ještě metody find a findAll sloužící taky k pohodlnému selectování.

Možná to má nějakou logiku, kterou nevidím, ale spíš mi přijde, že by to tady chtělo rozhraní trochu učesat.

před 11 lety

David Grudl
Nette Core | 6806

Pokusím se to vysvětlit. DibiTable je experiment, podobně jako DibiFluent, což vlastně vzniklo jako programátorská rozcvička. Zaroveň to prověřuje kvality jádra dibi. V reálných aplikacích jsem ani jedno zatím nepoužil, naopak se mi to výborně hodí do tutoriálů (třeba v Nette), protože je to srozumitelné.

S odstupem času bych řekl, že DibiFluent uzrálo a klidně bych jej mohl začít používat místo klasických SQL příkazů. Naopak DibiTable vidím jako mrtvou věc. API se mi nelíbí, dřív než vykrystalizovalo to začali lidé používat a teď je těžké to nějak česat. Navíc bych to chtěl udělat způsobem, který je v PHP 5.2 téměř neřešitelný a půjde rozumně implementovat až v PHP 5.3. Takže to spíš vidím na druhý pokus třeba pod názvem DibiRecord.

Ale neděste se, prostě jen DibiTable nerozumím, protože je nepoužívám :-) Pokud bude vůle API učesat i za cenu nekompatibility (dyť jsem varoval, že je to experimental :-) ), rád to udělám. Ale chce si to dát tu práci, pohrát si s tím v reálných aplikacích a výsledky shrnout do nějakého koncepčního návrhu.


Výhoda PHP 5.3 je v tom, že lze dotazy nad tabulkou volat staticky Article::find() namísto $article = new Article; $article->find(). Dále lze používat i magické statické metody Article::fetchByKdesiCosi().

před 11 lety

phx
Člen | 652

Ohledne budoucich implementaci spise zachoval nazev DibiTable a soucasnou implementaci nazval DibiTableOld. Kdo to nebude chtit pouzivat si to proste prepise. Nebo prehraje 2 soubory pres sebe.

Osobne me DibiTable take moc nezaujalo. Sice tam jsou dost pekne znazorneny nejake veci ktere jsem vyuzil jako inspiraci pro svuj DBReadServices a DBWriteServices. Na DibiTable se mi nelibi to, ze to castecne micha dohromady Model a Service. Osobne preferuji 100% nezavislost na vzhledu tabulek v DB a s DB komunikuji prostrednictvim Sluzeb a Modelu.

I kdyz ted kdyz koukam do zdrojaku tam uz nevim kde a kdy jsem to michani videl. Lepsi pojmenovani by bylo asi inteligentnejsi rozhrani pro konkretni tabulu v DB.

Otazka: lze nejak nastavit aby vracelo muj konkretni objekt napr muj DBModel a ne DibiRow? Idealne pred dotazem anstavit ze vysledkem ma byt nejaky objekt (napr pro tabulku Auta to bude objekt Auta potomek DBModel)

před 11 lety

dmajda
Člen | 22

David Grudl napsal(a):

Naopak DibiTable vidím jako mrtvou věc. API se mi nelíbí, dřív než vykrystalizovalo to začali lidé používat a teď je těžké to nějak česat.

:-(

Navíc bych to chtěl udělat způsobem, který je v PHP 5.2 téměř neřešitelný a půjde rozumně implementovat až v PHP 5.3.

Vím, o čem mluvíš, protože jsem nedávno něco podobného zkoušel implementovat taky a narazil jsem minmálně na absenci late static binding.

Ale neděste se, prostě jen DibiTable nerozumím, protože je nepoužívám :-) Pokud bude vůle API učesat i za cenu nekompatibility (dyť jsem varoval, že je to experimental :-) ), rád to udělám. Ale chce si to dát tu práci, pohrát si s tím v reálných aplikacích a výsledky shrnout do nějakého koncepčního návrhu.

DibiTable reálně používám (byť zatím jen v jedné poměrně jednoduché aplikačce) a přijde mi to jako celkem užitečná (byť nedokonalá) zkratka. Do tříd odvozených od DibiTable si taky cpu všechny metody pracující s databází, aby se mi SQL neválelo po kódu. Tj. používám DibiTable trochu jako model v MVC.

Ad koncepční návrh: Myslím, že jediný takový návrh, který ze mě vypadne, je „okopírovat ActiveRecord z Rails“ :-) Ale je mi jasné, že tohle slyšet nechceš… nehledě na to, že v PHP < 5.3 to prakticky není technicky realizovatelné.

před 11 lety

David Grudl
Nette Core | 6806

phx napsal(a):

Otazka: lze nejak nastavit aby vracelo muj konkretni objekt napr muj DBModel a ne DibiRow? Idealne pred dotazem anstavit ze vysledkem ma byt nejaky objekt (napr pro tabulku Auta to bude objekt Auta potomek DBModel)

Už jo, přes $res->setRowClass(‚Auta‘);

před 11 lety

David Grudl
Nette Core | 6806

dmajda napsal(a):

Ad koncepční návrh: Myslím, že jediný takový návrh, který ze mě vypadne, je „okopírovat ActiveRecord z Rails“ :-) Ale je mi jasné, že tohle slyšet nechceš… nehledě na to, že v PHP < 5.3 to prakticky není technicky realizovatelné.

Proč ne? Zkus to prosím udělat. Myslím že hodně lidí tady (včetně mě) ActiveRecord zná jen od slyšení. Zkus vytvořit návrh, jaké metody by taková třída měla mít, jak by se měla používat. Samozřejmě v souladu s konvencí jiných tříd v dibi.

před 11 lety

phx
Člen | 652

Mozna pro nezasvecene by bodnul nejaky pekny dokument, ktery popisuje co to je a jake to ma ideje. Ano mohu si to vygooglit, ale urcite vite o nejakem kde to je krasne jasne popsane.

před 11 lety

dmajda
Člen | 22

David Grudl napsal(a):

dmajda napsal(a):

Ad koncepční návrh: Myslím, že jediný takový návrh, který ze mě vypadne, je „okopírovat ActiveRecord z Rails“ :-) Ale je mi jasné, že tohle slyšet nechceš… nehledě na to, že v PHP < 5.3 to prakticky není technicky realizovatelné.

Proč ne? Zkus to prosím udělat. Myslím že hodně lidí tady (včetně mě) ActiveRecord zná jen od slyšení. Zkus vytvořit návrh, jaké metody by taková třída měla mít, jak by se měla používat. Samozřejmě v souladu s konvencí jiných tříd v dibi.

Myslím, že na tohle nejsem ten pravý, už jen proto, že jsem v životě z ActiveRecord využil tak 10% jeho možností (zhruba odpovídajících tomu, co je v DibiTable). Můžeme o tom víc pokecat ve středu…

před 11 lety

dmajda
Člen | 22

phx napsal(a):

Mozna pro nezasvecene by bodnul nejaky pekny dokument, ktery popisuje co to je a jake to ma ideje. Ano mohu si to vygooglit, ale urcite vite o nejakem kde to je krasne jasne popsane.

Pěkný popis lze nalézt asi v každé dobré knížce o Rails. Jinak můžu poskytnout odkaz na dokumentaci API, ze které se toho myslím dá docela dost vykoukat. Nejdůležitější je třída ActiveRecord::Base, která je předkem všech modelů.

BTW do Zendu něco jako ActiveRecord chtějí dodělat.

před 11 lety

phx
Člen | 652

dmajda napsal(a):
Můžeme o tom víc pokecat ve středu…

Co se kde deje ve stredu?

před 11 lety

dmajda
Člen | 22

před 11 lety

phx
Člen | 652

Davide muzes nastinit jakou mas predstavu o nastupci DibiTable? Rad bych nacerpal inspiraci. Navic by asi bylo lepsi diskutovat drive a ne az to lidi zacnou pouzivat;)

před 11 lety

phx
Člen | 652

Nepochlubis se?

před 11 lety

David Grudl
Nette Core | 6806

Nemůžu. Nemám čím :-)