Databázová vrstva pro Nette: dibi, Doctrine, NotORM?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8117
+
0
-

Vždy jsem považoval za výhodu Nette, že není pevně svázáno se žádnou databázovou vrstvou. Historie v tomto dala za pravdu, třeba tím, že jiné frameworky, dříve s DB svázané, přicházejí s novými verzemi chlubícími se, že už svázané nejsou. Také jsem nikdy nechtěl (byť nesvázaně) implementovat ActiveRecord, protože jsem ho považoval za nesmysl vhodný leda tak k vytvoření blogu za 15 min a pobláznění davů, což opět vývoj onde potvrzuje.

(tohle nepíšu, abych dělal ramena, ale jako úvod do současné situace)

Ačkoliv je spousta plánů, co se dá na Nette vylepšovat, čistě z praktického pohledu zjišťuji, že nejvíc času a úsilí nechávají programátoři na straně modelu. Jinými slovy, když se v Nette vyřeší nějaké zásadní body, ušetří to programátorům 5–10 % námahy, ale model je stojí 80 %, takže vylepšování Nette má v důsledku spíš kosmetický efekt. Bohužel nežijeme ve světě, kde by si programátor vybíral z desítek výborných databázových vrstev, takže zaměřit se na model bude mít pro něj největší přínos.

Podpora modelu

(pro jistotu: model !== databázová tabulka, stejně jako prezentační vrstva !== html)

Podpora modelu se dá rozdělit do tří částí:

  1. podpora na straně presenteru/šablony: snad nikoho nepřekvapí že šablona může sama požádat model o data, která vykreslí. Chybí ale obecný mechanismus, jak může vytvořit odkaz, který data modifikuje, nebo nalinkovaný způsob, jak se vůbec k modelu připojit.
  2. podpora na straně modelu: sandbox by měl naznačit způsob inicializace modelu a framework dodat nástroje pro validaci dat. Co je ale nejpodstatnější, tak dodat vrstvu pro práci s databází.
  3. podpora na straně nástrojů: a tím je výchozí administrace (nemyslím generátor administrací, ale univerzální a modifikovatelná administrace)

Mít v Nette vrstvu pro práci s databází, není to popření prvního odstavce? Rozhodně ne, nejde mi o svázání, ale o dodání výchozího řešení. Jak jsem psal, v případě databázových vrstev není moc z čeho vybírat a pomalu každý programátor stojí před otázkou: „co použít“ a já mu chci dát odpověď, současně s možností s mou odpovědí nesouhlasit.

Kterou vrstvu použít?

Máme tu nejstarší dibi, staré a nativní PDO, nové NotORM a staronové Doctrine (a pak samozřejmě stovky dalších projektů, ale s toutu čtveřicí si vystačíme). Volbu knihovny bych podřídil jediné otázce: co tvůrci webových aplikací od databáze očekávají?

  1. potřebují vypisovat její surový obsah a to v nejrůznějších formách, dost často specifikovaných až v šabloně (řazení, stránkování, filtrování); přičemž řádově méně potřebují vypisovat data nějakým způsobem přechroustaná přes další vrstvy byznys logiky, byť i tohle je občas třeba.
  2. používají triviální insert/update/delete
  3. nepotřebují měnit podobu databází, krom zjišťování metainformací o tabulkách pro automatické administrace nebo deployment
  4. v určitých případech se hodí automatické persistování objektů do databáze
  5. v případě Nette se předpokládá, že to bude fungovat intuitivně, zatraceně dobře a výkonně ;-)

Po úvahách mi vyplynulo, že nejvhodnějším adeptem je něco, co je z 85 % NotORM, 10 % dibi a z 5 % Doctrine 2. A tohle bych strašně rád viděl jako nativní součást Nette :-)

NotORM je skutečně geniální dílko Jakuba Vrány. Mimochodem jde o první produkt implementující plánované předbíhání budoucnosti a řešící MVC paradox mnohem lépe, než DibiDataSource. Přičemž nakopírování NotORM do distribučního balíku mi nevyhovuje, rád bych jej více přizpůsobil ekosystému Nette, odmagičtil, začlenil do něj některé funkce z dibi a vytvořil standardní administraci. Myslím, že by to mohl být skutečně úžasný výchozí nástroj, který plně vyhoví drtivé většině potřeb.

p.s. vývoj této knihovny bude probíhat tak, jak je u Nette dobrým zvykem: přepíšu pro něj všechny své projekty, takže výsledek nebude akademická šaškárna, ale ryze praktický výborně použitelný produkt

Tharos
Člen | 1030
+
0
-

Takže dneska jdu slavit a hezky až do rána :). Konečně z frameworku zmizí něco, co osobně považuji za jednu z jeho největších slabin: nenabízí žádné řešení ani „best practices“, jak řešit model. Myslím, že tohle je opravdu skvělý krok. Jen tak dál!

Edit: Abych se ale vyjádřil k věci, můj (bezvýznamný) názor je asi hodně podobný jako Tvůj. Experimentoval jsem v jednom projektu s NotORM a pracovalo se mi s ním vcelku dobře (i když výhrady jsem měl a v dalším projektu jej zase nepoužil). Takže za sebe mohu říct, že kdyby podobné rozhraní mělo nativně dibi a bylo by to celé do Nette nějak hezky integrovatelné, asi bych už dále nehledal.

Editoval Tharos (8. 12. 2010 17:14)

Radek Hulán
Člen | 7
+
0
-

Na NotORM jsem koukal. Jakub se tam snaží trošku o obstrakci funkcí, v nichž se databázové engine odlišují (třeba LIMIT / OFFSET), ale není to dotaženo (něco málo dělá pro Oracle).

Druhým kritickým bodem je práce s datumem a časem, to má také každá DB jinak, takže pokud má mít layer smysl, chtělo by takové funkce doplnit.

Třetím bodem je „lastInsertId“ při INSERTu – v některých DB není klasický autoincrement a dělá se to jinak, třeba přes sekvence.

Čtvrtým bodem je ukládání velkého textu – CLOB, XML a další. Opět, v některých DB to není možné nacpat do běžného SQL dotazu.

Pátým bodem je fulltext. V každé DB se hledá jinak.

To není míněno jako kritika, jen pokud má mít layer smysl oproti přímému použití PDO, pak by aspoň těchto pár věcí navíc měl (IMHO) přinášet. Pokud by byl zájem, pro Oracle a SQL Server rád logiku doplním.

Editoval Radek Hulán (8. 12. 2010 17:44)

Jod
Člen | 701
+
0
-

++1 notorm, použil som ho v pár projektoch, aj väčších ako firemný systém a som s ním spokojný. Zase viem, že u nás v práci by sme s ním nevyžili, kedže sem tam treba spraviť väčšiu query, kde to chce maximálne dibi. Svojou jednoduchosťou sa k nette výborne hodí. Doctrine by som nechal ZF :)

Teyras
Člen | 81
+
0
-

Osobně bych v Nette pro přístup k datům rád viděl nějaký obecný objekt na způsob DataSource a konkrétní řešení práce s databází ve stylu dibi… NotORM jsem ještě moc zblízka nezkoumal, takže nemůžu soudit. Doctrine se mi k Nette prostě nehodí, i když to je možná jen tím, že mi nevoní samo o sobě :) Hlavně ale moc nesouhlasím se zbytečným začleňováním cizích projektů, i když ta volba by tu zůstat měla…

Editoval Teyras (8. 12. 2010 19:02)

Filip Procházka
Moderator | 4668
+
0
-

Prý tu chybí zastánci Doctrine, tak jsem tady :) Ale teď vážně, …

výchozí model je pěkná myšlenka
nikdy jsem se nějak nesžil s potřebou rozhodovat o řazení dat v templatě

just an idea:
nette/sandbox
nette/sandbox-dibi
nette/sandbox-doctrine2
nette/sandbox-notorm

Editoval HosipLan (8. 12. 2010 20:31)

Teyras
Člen | 81
+
0
-

Jo, to jsem chtěl taky říct… Kdyby pro to byl nějakej na layeru/systému ukládání nezávislej způsob (nejspíš interface), klidně bych se s řazením a stránkováním v template sžil :)

Lopo
Člen | 277
+
0
-

mno neviem … ja osobne som vacmene odporca akehokolvek ORM/NotORM (tj ineho nez priameho zapisu SQL) a stale pouzivam len dibi (bez fluentov) do ktoreho som si dorobil

vychadzam z niekolkorocnych skusenosti – bud som robil tak male veci ze ich tlacenie cez nejaku abstrakciu nemalo zmysel a bol to kanon na vrabce, alebo som robil tak velke a zlozite veci ze jednoducho sa to nedalo pouzit a musel som si SQL dotazy pisat priamo sam (prilis velke a zlozite, alebo hodne parametrizovane)

alebo ako aj teraz – v nasom intranete sa pristupuje k 2 uplne rozdielnym DB (MySQL, Ingres) pricom do buducna je realna moznost ze pribudne este MSSql

Ak ale zostane moznost aj nadalej pouzit samotne dibi aby sa dali pisat priamo SQL dotazy, tak nemam vyhrady proti doplneniu dalsej moznosti v podobe hibridu NotORM/dibi a asi ho budem aj pouzivat v pripade projektov ktore maju pouzitu len jednu DB a jej velkost/zlozitost bude tomu rozhraniu zodpovedat

Filip Procházka
Moderator | 4668
+
0
-

Můžeš mít přece více instancí NotORM, tak jako máš více spojení v dibi, stejně neuděláš přenášení dat na úrovni SQL mezi dvěma spojeními, stejně budeš mít 2 připojení, NotORM je jenom rychlejší způsob jak data získat.

Co se týče komplexity, u jednoduchých věcí „kde byla abstrakce přítěží“ bych se naopak NotORM vůbec nebál, nesleduju jak dobře je na tom s opačným směrem (zápis), ale určitě je to použitelné při skombinování s dibi.

Což je další věc co jsem chtěl navrhnout. Udělat z NotORM šikovnější DataSource, napadlo mě to v souvislosti s tím co napsal David, takže ho to určitě napadlo už taky… Zkrátka začlenit NotORM do dibi, vedle nativních SQL, fluent a datasource.

Zpátky ke komplexitě… Co se týče velice, velice složitých věcí, je to jenom otázka návrhu, nemyslím si, že dobře navržená struktura entit ti bude ztěžovat získávání složitých struktur z databáze. Naopak.

Navíc (ono to sice platí i u čistého SQL, ale o to tady ještě víc) cokoliv napíšeš, nemusíš psát znovu, čím víc abstraktnější nástroj použiješ, tím míň pak budeš muset udělat úprav, když kód budeš chtít použít jinde.

Malý dodatek nakonec… Stejně přirozeným vývojem k abstrakci všichni dojdeme, já jsem došel už myslím docela daleko, když jsem se pustil do Doctrine. Jediné co vám všem v tom brání, jsou vlastní předsudky a nechuť zkoušet nové věci, protože stačí vyzkoušet něco nového a názor změníte, to jestli se se přikloníte k NotORM, nějakému ActiveRecord, nebo kanónu Doctrine2 je zase něco jiného.

Lopo
Člen | 277
+
0
-
  • viac instancii – nemam prakticke skusenosti so ziadnym ORM takze ak je taka moznost potom v poho
  • pri jednoduchych veciach mi pride zbytocne aby sa dotaz nejako dynamicky skladal alebo co … napisem ho priamo a mam pokoj
  • zlozite veci – ak mi 1 report robi niekolko 10-tok dotazov nad 10-kami tabuliek ktore maju 100-tisice az miliony zaznamov tak pochybujem ze nejaky automat mi tie dotazy posklada lepsie nez ako som ich ja poskladal
  • abstrakcia je dobra vec … ale osobne mam rad plnu kontrolu nad tym co do DB ide

dalsia vec ohladom komplexnosti – v niektorych reportoch som nuteny fungovat pomocou alter-ovania tabuliek na zaklade aktualnych hodnot vypoctu, tj napr pridavam stlpce z nejakeho predtym ziskaneho zoznamu a pod. co tiez nie je prave asi zrovna trivialne pouzivanie DB

Filip Procházka
Moderator | 4668
+
0
-

asi trošku utíkáme od tématu takže pro zájemce, pokračování tady: http://nezmar.jabbim.cz/…0/12/09.html#… ;-)

Šaman
Člen | 2634
+
0
-

Tak to je balada. Souhlasím stoprocentně s Davidem že na modelu aplikace stojí a že současné Nette v tomto směru sice k ničemu nenutí, ale také nic nenabízí.

Myslím, že použitelný nástroj pro začátečníky by se určitě hodil. Guru, evangelíci, masteři a podobná individua si samozřejmě mohou používat co chtějí ale oni už vědí proč. Lamky jsou rády za předžvejkané řešení pro které jsou psané i tutoriály a best practise.

vrana
Člen | 131
+
0
-

Radek Hulán napsal(a):

To není míněno jako kritika, jen pokud má mít layer smysl oproti přímému použití PDO, pak by aspoň těchto pár věcí navíc měl (IMHO) přinášet. Pokud by byl zájem, pro Oracle a SQL Server rád logiku doplním.

Díky za nabídku, pomoc u těchto databázových systémů určitě ocením. NotORM nicméně chápu jako skládač dotazů, takže třeba podporou různých syntaxí fulltextu si nejsem jist. Do ostatních věcí se můžeš pustit ve forku na GitHubu.

David Grudl
Nette Core | 8117
+
0
-

Součástí sandboxu je Adminer se speciálním namixovaným skinem ;-)

Rampa
Člen | 65
+
0
-

No to mě hrábne… Nějaký čas se mořím s vlastní implementací a když to skoro je (rozuměj „před refactorem“), tak si tu přečtu, že to bude součástí FW :)
Moje řešení je postaveno jako ORM nadstavba nad dibi ala Doctrine2.
Takže si definuju entity přes anotace, nastavuji typ dat, jointy, subkolekce (objednávka->položky) atd. No a pak už se jen vytvoří Entity Manager a instancujou entity.
Dále mám navázane komponenty, kterým se předá Entita(kolekce) a vytvoří se control s tabulkou, včetně paginatoru a sub tabulky(tady vývoj zamrznul – potřebuju dynamické snippety :( ) nebo formulář s validací dat (bráno z definice entity). Data čtu až když jsou opravdu potřeba a ne při vytvoření entity, zabraňuje to vytváření duplicitních entit, optimalizace zápisu do db…
… Kdyby to někoho zajímalo, mohu se podělit.

Honza Marek
Člen | 1664
+
0
-

Hlavně o ty jointy by ses mohl podělit.

Teyras
Člen | 81
+
0
-

Ono lidí, co si to řešili po svém, je asi spousta :) Myslím, že upnout to na github a poslat odkaz moc nestojí, a pokud je to kvalitní řešení nebo aspoň dobrej nápad, někdo si toho určitě všimne…

PJK
Člen | 70
+
0
-

Já jsem se před nějakou dobou slavnostně dokopal k Doctrině a teď jsme kamarádi. Ale chápu, že je to trochu těžší kalibr a má své mouchy (a je jich dost…). NotORM se mi od pohledu líbí, klidně by mohlo být v distribuci. Má někdo ukázku použití NotORM s Nette?

grey
Člen | 94
+
0
-

Rampa wrote:

No to mě hrábne… Nějaký čas se mořím s vlastní implementací a když to skoro je (rozuměj „před refactorem“), tak si tu přečtu, že to bude součástí FW :)
Moje řešení je postaveno jako ORM nadstavba nad dibi ala Doctrine2.
Takže si definuju entity přes anotace, nastavuji typ dat, jointy, subkolekce (objednávka->položky) atd. No a pak už se jen vytvoří Entity Manager a instancujou entity.
Dále mám navázane komponenty, kterým se předá Entita(kolekce) a vytvoří se control s tabulkou, včetně paginatoru a sub tabulky(tady vývoj zamrznul – potřebuju dynamické snippety :( ) nebo formulář s validací dat (bráno z definice entity). Data čtu až když jsou opravdu potřeba a ne při vytvoření entity, zabraňuje to vytváření duplicitních entit, optimalizace zápisu do db…
… Kdyby to někoho zajímalo, mohu se podělit.

určitě to hoď na github…

Filip Procházka
Moderator | 4668
+
0
-

grey napsal(a):

určitě to hoď na github…

A sem pak odkaz :)

David Grudl
Nette Core | 8117
+
0
-

Základní implementaci mám hotovou, ale přemýšlím, jak finálně pojmenovat jednotlivé třídy. Názvy Row nebo Connection mi připadají příliš obecné, byť ve jmenném prostoru dávají smysl (Nette\Database\Row).

mkoubik
Člen | 728
+
0
-

Jak jde Nette\Database\Row dohromady s model !== databázová tabulka? Nebo jsem mimo a moc si toho domýšlím?

Honza Marek
Člen | 1664
+
0
-

David Grudl napsal(a):

Základní implementaci mám hotovou, ale přemýšlím, jak finálně pojmenovat jednotlivé třídy. Názvy Row nebo Connection mi připadají příliš obecné, byť ve jmenném prostoru dávají smysl (Nette\Database\Row).

A o tom jsou jmenné prostory :)

Jan Tvrdík
Nette guru | 2595
+
0
-

Pokuď někomu vadí používaní Row, tak si může doplnit use Nette\Database as DB a používat pakDB\Row.

JakubJarabica
Gold Partner | 184
+
0
-

mkoubik napsal(a):

Jak jde Nette\Database\Row dohromady s model !== databázová tabulka? Nebo jsem mimo a moc si toho domýšlím?

Pri používaní dibi máš DibiRow kľudne aj ako JOIN viacerých tabuliek. A vystupuje to ako jeden riadok. To isté s Datagridom ;)

David Grudl
Nette Core | 8117
+
0
-

Ještě pár poznámek:

  • NotORM a dibi budou nadále samostatné knihovny, Nette\Database není plnohodnotnou náhradou
  • Nette\Database bude narozdíl od dibi založena čistě na PDO. Myslím, že v dnešní době už je PDO dostatečně rozšířené a doufám, že i vyzrálé. Výhodu vidím v tom, že netřeba vynalézat kolo a psát drivery na základní operace. Ačkoliv teda bez driverů se ani tady člověk neobejde…
  • skládání dotazů v PDO je oproti dibi značně omezené a ani v Nette\Database nebude podpora modifikátorů. Nicméně nemělo by to ve výsledku ničemu vadit, prostě se použije trošku jiný (nikoliv složitější) styl práce.
  • získávání dat ala NotORM bude mít asi trošku jinou syntax než v originálním NotORM, aby to nemátlo, bude se třída jmenovat jinak
  • persistence objektů nebo data-mapper se objeví až později
Lopo
Člen | 277
+
0
-

takze pre DB systemy bez PDO podpory nepouzitelne (napr. Ingres) …

paranoiq
Člen | 392
+
0
-

stejně jako sis mohl napsat vlastní DibiIngresDriver, můžeš si napsat i vlastní PDO ovladač (a nemusí to být v céčku!). stačí napsat vlastní rozšíření tříd PDO a PDOStatement

paranoiq
Člen | 392
+
0
-

@David: „Nette\Database není plnohodnotnou náhradou“

znamená to, že bude nutné na specifické věci používat Dibi nebo něco jiného? (pokud ano, znamenalo by to v případě non-PDO řešení duplicitní spojení k databázi a možné problémy s transakcemi)

David Grudl
Nette Core | 8117
+
0
-

Jsou takové věci, které nelze udělat v PDO?

JakubJarabica
Gold Partner | 184
+
0
-

paranoiq napsal(a):

stejně jako sis mohl napsat vlastní DibiIngresDriver, můžeš si napsat i vlastní PDO ovladač (a nemusí to být v céčku!). stačí napsat vlastní rozšíření tříd PDO a PDOStatement

Nemyslím si, že bude treba: http://community.ingres.com/wiki/PDO_Ingres.

paranoiq
Člen | 392
+
0
-

David Grudl napsal(a):
Jsou takové věci, které nelze udělat v PDO?

budiž tedy PDO. blbá otázka (ta moje)

_Martin_
Generous Backer | 679
+
0
-

@JAM3SoN, @Jan Tvrdík:

Myslím, že @mkoubik měl na mysli entitu. Třída řádek evokuje paralelu s řádkem relační DB, byť by to bylo více JOINů, entita naopak může obsahovat další entity (tedy něco, co si pod pojmem řádek jen těžko představit).

Čili k zamyšlení: pokud je do budoucna v plánu persistence objektů a data-mapper, pojmenování entita by mohlo charakter té třídy vystihovat lépe než pojmenování řádek.

Filip Procházka
Moderator | 4668
+
0
-

Entita má význam při spojení s data-mapperem, protože řádek obsahuje všechny data z jednoho vráceného záznamu, kdežto entity zastupují ty data ve struktuře.

Lopo
Člen | 277
+
0
-

JAM3SoN napsal(a):
Nemyslím si, že bude treba: http://community.ingres.com/wiki/PDO_Ingres.

to som nasiel ale mal som s tym davnejsie problemy pri rozbiehani a vyvoj je co som to kontroloval nijaky uz niekolko rokov …

paranoiq napsal(a):
stejně jako sis mohl napsat vlastní DibiIngresDriver, můžeš si napsat i vlastní PDO ovladač (a nemusí to být v céčku!). stačí napsat vlastní rozšíření tříd PDO a PDOStatement

mno ak to bude az take jednoduche tak potom (snad) v poho

Lopo
Člen | 277
+
0
-

teraz po zbeznom pozreti Database mam dotaz:

  • ako riesit prefixovanie tabuliek ?

v dibi bola moznost nastavit globalny prefix … co som ohackoval aby som vedel pouzivat connection-specific prefix …

ale v tomto novom Database nevidim ziadnu moznost nastavenia prefixovania … resp jedine podedenim a prepisanim viacerych metod co mi zrovna idealnym riesenim nepripada

Tharos
Člen | 1030
+
0
-

Je to řešit například takhle. No, je to trošku škrabání se levou rukou kdo ví kde… Vestavěná podpora pro prefixy by se určitě hodila.

Ondřej Mirtes
Člen | 1536
+
0
-

Já nějak nechápu, proč aktuální Nette\Database !== dibi, ale něco nového a bez té příjemné dibi syntaxe, DibiFluent a dalších.

edke
Člen | 198
+
0
-

Ondřej Mirtes wrote:

Já nějak nechápu, proč aktuální Nette\Database !== dibi, ale něco nového a bez té příjemné dibi syntaxe, DibiFluent a dalších.

+1

Oggy
Člen | 306
+
0
-

Ondřej Mirtes napsal(a):

Já nějak nechápu, proč aktuální Nette\Database !== dibi, ale něco nového a bez té příjemné dibi syntaxe, DibiFluent a dalších.

Uvidíme co z toho bude, ale za sebe můžu říct, že po chvilce zvykání je NotORM velmi příjemné.

JakubJarabica
Gold Partner | 184
+
0
-

@Oggy:
Máš ukážkový kód ako to používaš? NotORM mám prečítanú dokumentáciu, ale aktuálne si neviem predstaviť ako by som príklad nižšie napojil na Latte šablóny. Podľa príkladu tu: http://zdrojak.root.cz/…ne-s-notorm/#…, konkrétne táto časť:

<?php
foreach ($products as $product) {
    echo "<h3>" . htmlspecialchars($product["name"]) . "</h3>\n";
    list($suppliers) = $product->product_supplier()->aggregation("COUNT(*)");
    echo "<p>Cena: $product[price] Kč, dodavatelů: $suppliers</p>\n";
}
?>

Ako pretransformujem ten agregačný dotaz do latte?
Chcel by som mať niečo takéto:

<?php
{foreach $produkty as $produkt}
	<h3>{$produkt["name"]}</h3>
	{$produkt_suppliers}
{/foreach}
?>

.. alebo bez agregácie:

<?php
{foreach $produkty as $produkt}
	<h3>{$produkt["name"]}</h3>
	{if count($produkt_suppliers)>0}
		<ul>
		{foreach $produkt_suppliers as $supplier}
		<li>{$supplier["name"]}</li>
		{/foreach}
		</ul>
	{/if}
{/foreach}
?>

.. teda neviem ako sa zbaviť toho list(..) v šablóne. Nie je to tam pekné a radšej by som v render* naplnil $products a možno nejako $suppliers.

Oggy
Člen | 306
+
0
-

JAM3SoN napsal(a):

@Oggy:
Máš ukážkový kód ako to používaš?

vlastně stejná struktura jako u toho ukázkové kódu:
tabulka entry = appliaction, entry_tag = application_tag, project = author .. jen pro lepší pochopení

model:

<?php
    static function recentEntries() {
        return self::$notORM->entry("date >= CURDATE()-3")
                        ->select('entry.*, project.name, project.archived')
                        ->where('user_id',Environment::getUser()->getIdentity()->getId())
                        ->order("date DESC");

    }
?>

šablona:

<?php
<table>
    <tr n:foreach="Entry::recentEntries() as $entry">
        <td>{$entry["time"]}</td>
        <td>{$entry["name"]}</td>
        <td>
            <span n:foreach="$entry->entry_tag() as $entry_tag">
                {$entry_tag->tag['name']}
            </span>
            <p n:if="$entry['description']">{$entry['description']}</p>
        </td>
        <td>{$entry['date']|date}</td>
    </tr>
</table>
?>

vygeneruje tyto dotazy:

<?php
SELECT entry.*, project.name, project.archived FROM entry LEFT JOIN project ON entry.project_id = project.id WHERE (date >= CURDATE()-3) AND (user_id = '1') ORDER BY date DESC

SELECT entry_id, tag_id FROM entry_tag WHERE (entry_tag.entry_id IN ('11', '12'))

SELECT id, billable, name FROM tag WHERE (tag.id IN ('15', '16'))
?>

Jak moc je to správně nevím..

S očekáváním čekám:-) co vyplave z té Databázové vrstvý pro Nette

Editoval Oggy (15. 12. 2010 15:34)

Oggy
Člen | 306
+
0
-

JAM3SoN napsal(a):

Ako pretransformujem ten agregačný dotaz do latte?
Chcel by som mať niečo takéto:

<?php
{foreach $produkty as $produkt}
	<h3>{$produkt["name"]}</h3>
	{$produkt_suppliers}
{/foreach}
?>

tady myslím že musí být něco jako..

<?php
{$produkt->produkt_suppliers()}
?>

Editoval Oggy (15. 12. 2010 15:37)

vrana
Člen | 131
+
0
-

JAM3SoN napsal(a):

list($suppliers) = $product->product_supplier()->aggregation(„COUNT(*)“);

Použití v šablonách byl hlavní důvod, proč se v této oblasti syntaxe už před delší dobou změnila. Nyní lze použít $product->product_supplier()->count("*"). Viz http://www.notorm.com/#api

JakubJarabica
Gold Partner | 184
+
0
-

Veľmi pekne dakujem obom! Zjavne jeden z dvoch osobných projektov prepíšem z Doctriny do NotORM, nech mám čo porovnávať :)

Tharos
Člen | 1030
+
0
-

Jakube, nestálo by za to někde více demonstrovat možnosti NotORMu při použití s Nette? I když jsem si vědom, že o tom je jedno ze Tvých školení, a tak chápu, že možná nechceš hromadně rozdávat jisté know-how. Jak už jsem psal, NotORM jsem na jednom Nette projektu testoval, ale setkal jsem se s problémy, u kterých mi nyní připadá, že do jisté míry vyplývaly z mé neznalosti NotORMu.

Pracuješ s NotORM objektem přímo v šabloně? Co když poté dojde k chybě a část šablony už je na výstupu, není s tím problém? Anebo s NotORMem pracuješ v Presenterech? Jak řešíš modely, kde potřebuješ více, než jen „protlačit joinovaná data“ z databáze?

Oggy
Člen | 306
+
0
-

Tharos napsal(a):

Jakube, nestálo by za to někde více demonstrovat možnosti NotORMu při použití s Nette?

Já se také přikláním k prosbě o nějaký tutoriál na použití spolu s Nette ..
A třeba i na nějaké méně používáné příkazy.. na hromadný insert, využítí při transakci apod.

Editoval Oggy (15. 12. 2010 16:24)

vrana
Člen | 131
+
0
-

Tharos napsal(a):

Jakube, nestálo by za to někde více demonstrovat možnosti NotORMu při použití s Nette?

Já si své know-how nijak nestřežím a snažím se ho dávat k dispozici i mimo školení. Jen je vždycky potřeba najít vhodnou formu. Konkrétně návrh modelu využívající NotORM plánuji natočit jako třetí díl video-tutoriálu srovnávajícího NotORM a Doctrine 2.

S objekty třídy NotORM_Result i NotORM_Row pracuji rovnou v šabloně. Co se chyb týče, tak jejich zpracování záleží na tom, zda jsou lokální nebo globální. Globální chyby (jako třeba že jsem na detailu článku, který se nepodaří načíst) vyhazují výjimku z prezenteru a způsobí 404 nebo 500, lokální chyby (jako třeba nepodařený výpis diskuze u zobrazeného článku) se ošetřují lokálně v šabloně. Viz http://php.vrana.cz/…-vyjimky.php a navazující článek.

vrana
Člen | 131
+
0
-

Oggy napsal(a):

Já se také přikláním k prosbě o nějaký tutoriál na použití spolu s Nette ..
A třeba i na nějaké méně používáné příkazy.. na hromadný insert, využítí při transakci apod.

Podporu hromadného insertu jsem nedávno přidal přes NotORM_Result::insert($row1, $row2, ...). Na transakce žádná obálka není, ty je potřeba volat přímo přes PDO.

JakubJarabica
Gold Partner | 184
+
0
-

Práve na základe videí o Doctrine vs. NotORM som sa rozhodol prepísať „menší“ projekt do NotORM aby som si to poriadne odskúšal. Je to oveľa menšie zlo ako statické modely ^_^ Príde mi ako ideálny kandidát na webíky, kde netreba používať Versionable, Translatable či Tree interface-y Doctriny. Kde ideálne by som mohol klásť prípadné dotazy? php7.org zrejme nefunguje. A podľa ohlasov vidím, že viac ľudí zaujalo NotORM :)