Nápad na použití fluent DIBI v modelu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jadro007
Člen | 8
+
0
-

Ahoj všichni,
trochu jsem si hrál s fluent DIBI a napadla mě jedna taková menší vychytávka, možná to někoho z vás zaujme nebo mě přesvědčíte, že je to naprostá blbost :-)

Nejde o nic převratného, ale už k věci – na fluent DIBI se mi hodně líbí možnost vytvoření SQL factory, tedy funkce, která vrátí fluent DIBI, které lze dále upravovat. A napadlo mě, že bych mohl mít všechny funkce modelů vytvořené tak, aby vraceli fluent DIBI – takže jedna funkce může použít SQL jiné funkce, třeba funkce getCars si může spustit funkci getAll a pak jenom přidat

->setWhere("isCar = TRUE")

Na tomto řešní se mi nelíbila jedna věc a to když si v presenteru zavolám třeba

$this->vehicles->getCars()

, tak se mi vrátí fluent DIBI – jenže v presenteru fluent DIBI nemá moc co dělat a radši bych tam viděl data.. nebo byla možnost volat třeba

$this->vehicles->getCars()->fetchAll()

, ale nemám rád zbytečné psaní a tak jsem přemýšlel co s tím..

Přišel jsem podle mě na celkem elegantní řešní – z presenteru nebudu volat ->getCars(), ale

->loadCars()

, která bude vracet přímo data. Abych nemusel ručně vytvářet pro každou get funkci alternativní load, tak jsem si pohrál s magickou funkcí call, takže vše se děje naprosto automaticky bez nutnosti psát duplicitní funkce.

Kromě toho magiciky funguje

getCarsCount()

, tedy funkce, která upraví DIBI fluent v getCars() a vrátí efektivně počet záznamů.

Mimo to jsem ještě v praxi zjistil, že poměrně často používám LIMIT (stránkování atd.), takže jsem se rozhodl zprovozni zápis *

$this->vehicles->setLimit(100, 20)->loadCars()

, protože se mi nelíbí předávání LIMITu přes parametry funkce loadCars(), kde může být něco užitečnějšího vztažené přímo k dané funkci.

Editoval Jadro007 (11. 8. 2013 11:14)

mkoubik
Člen | 728
+
0
-

Nápad je to rozhodně dobrý a vsadím se že něco takového používá spousta lidí. Od tohohle řešení je už jen krůček k použití specification patternu, který ti umožní zbavit se záplavy metod typu getUnusedCarsOrderedByColor(). Doporučuju si pročíst: http://www.whitewashing.de/…itories.html (ukázky jsou sice pro Doctrine 2, ale celkem jednoduše si můžeš místo Doctrine\ORM\QueryBuilder domyslet DibiFluent).