1) Pokud jsou optimální selecty, které získávají data z db složitý, mám dvě možnosti:
a) vždy je napsat ručně (byť za mírné podpory nějaké leighweight knihovny typu notOrm – protože v sestavení správných where a join podmínek mi žádná taková knihovna nepomůže)
b) zabudovat genrování správných sql dotazů přímo do modelů: opět k čemu mezivrstvu. Teda pokud nepočítám knihovny typu dibi apod, který trochu zpřehledněj SQL zápis.
Kód přitom zas tak složitej není, protože obecný ORM modely se napíšou jednou a pořádně se otestujou, a v jednotlivých konkrétní modelech se pak píše aplikační logika a popř. upřesnění, jak má knihovna se záznamem nakládat (např. podle kterých sloupců má kontrolovat uživatelská práva).
Až na výjimky se v nich nemusí použít SQL – ale když je potřeba, tak to jde.
Jelikož např. práva jdou efektivněji vyřešit když vím, že dělám select
na děti jednoho rodiče, od nějž jediného mohou zdědit práva než když to nevím, tak jaksi model do generování SQL dotazů tak jako tak šahat musí – takže si nedokážu představit, jak oddělit model a databázovou vrstvu a přitom zachovat efektivní generování uživatelských práv.
Nehledě na to, že např. pro získání podřízených objektů model taky musí nějak „vědět“, jaké jsou jeho podřízené objekty a jaká je relace mezi nimi. A od toho je ke generování SQL dotazů takovej kousek, že vrážet tam další vrstvu se mi zdá jako zesložitění, nikoli zjednodušení.
2) Samozřejmě, že je to v notOrm o něco jednodušší – taky je to knihovna pro jednoduchej snadnej přístup k databázi. Platí za to flexibilitou a možností rozšíření.
Není potřeba předem určovat, se kterými tabulkami se bude pracovat.
Na druhou stranu, když budeš chtít pracovat pouze s autorem první aplikace, tak se ti stejně natáhnou všechny. Což příliš optimální není. Já si můžu vybrat. Nebo si myslíš, že tam dopsat automatický přednačítání všech podřízených záznamů by byl takovej problém? Asi tak na tři řádky. Je fakt, že tam můžu dát parametr, jestli to rovnou přednačíst nebo ne, to neni blbej nápad.
API zdá se vůbec nedovoluje přistoupit ke sloupci applicationautor.poradi.
Ale umožňuje, akorát jsem to psal z hlavy, tak jsem se nekouk, že autoriaplikace neni čistě vazební tabulka. Samozřejmě můžu přistupovat i pomocí
$app->childs('applicationautor')->childs('autor')
Akorát mám možnost dopsat objektu i složitější vazbu, pokud potřebuju.
Např. „ignorovat“ MxN vazební tabulku, která je v podstatě implementační detail.
Přenášení jen použitých sloupců je zajímavá featura, nicméně zatím jsem se nedostal do situace, kde bych masivně načítal takové množství záznamů, že by mě to pálilo. Taková kontrola uživatelskejch práv je daleko větší zdržení a to se udělat musí. Nicméně je to hezký nápad a nevylučuju, že se jím někdy neinspiruju.
No á závěrem :-) výhody mojí knihovny nevidíš, protože nevíš, co umí. Samozřejmě když porovnáš lehkou knihovnu zaměřenou na co nejjednodušší načítání dat z db se složitějším frameworkem, tak jednoduchá kniohovna mírně vyhraje snadností zápisu… Stejně jako když si dá silniční speciál na dálnici závody s offroadem.
Fór je v tom, že u toho funkce Tvojí knihovny končej, zatímco mojí začínaj, ať jde o modifikaci dat (ať už s automatickou nebo manuální synchronizací s databází), kontrolu práv (poměrně dosti netriviální, pomocí ACL, uživatelských skupin a dědění oprávnění z nadřazených objektů), kontrolu kvót na počet podřízených objektů daného typu, validace dat apod. A to všechno vzhledem k databázi šetrným způsobem.
Netvrdím, že se to hodí vždy a všude – dovedu si představit spoustu projektů, kde bych notORM použil radši, ale i naopak – jen prostě tvrdím, že jsou případy, kdy ORM přístup umí využít výhody ORM, aniž by ztratil schopnost pokládat inteligentní dotazy.