Komentáře k článku
Doctrine 2: načítání, ukládání a mazání

Seriál o novinkách, které pro vývojáře v PHP přináší databázová knihovna (ORM) Doctrine 2, pokračuje. V ukázkách minulých dílů jsme se letmo dotkli Entity Manageru. Dnes se na něj podíváme podrobněji a ukážeme si základní způsoby, jak své entity načítat, ukládat a mazat.
Čistý návrh entity
„Entita se sama neukládá, někdo ji vezme a někam uloží.“
To je správně. Zároveň ale entita v anotaci obsahuje informaci, k jaké databázové tabulce se váže, což by IMHO neměla – máslo taky neví, jestli patří do ledničky.
Re: Čistý návrh entity
A když nepoužijeme anotace, ale zapíšeme mapování do XML? Anotace se jménem tabulky mi přijde jako informace pro toho, kdo chce s máslem něco dělat, ne pro samotné máslo.
Re: Čistý návrh entity
Zároveň ale entita v anotaci obsahuje informaci, k jaké databázové tabulce se váže, což by IMHO neměla – máslo taky neví, jestli patří do ledničky.
Máte pravdu, neměla. Tato informace do entity z čistě návrhového hlediska opravdu vůbec nepatří. V tomto případě ale převažuje čistě praktické hledisko nad akademickou čistotou – takhle nám to umožňuje udržovat všechny definice související s danou entitou přehledně na jednom místě, namísto co bychom místo toho část psali do entity a část do konkrétního mapperu. Ale jinak s námitkou opravdu souhlasím, také mě to dráždí.
Re: Čistý návrh entity
Máslo samo to sice neví, ale má to na sobě napsané, v případě mého exempláře doma: „Skladujte při teplotě od 4°C do 8°C“ :). Takže i máslo má v podstatě anotaci :).
Re: Čistý návrh entity
Ale už třeba neví, jestli patří do mé ledničky, nebo do ledničky souseda :)
Re: Doctrine 2: načítání, ukládání a mazání
[cite]Jinými slovy pokud uvnitř jakékoliv entity potřebujete sáhnout na Entity Manager, děláte něco špatně.[/cite]
jak potom docílím něčeho jako:
$articleEntities=$categoryEntity->getArticleEntities();
?
Musím pokaždé někde explicitně volat Entity Manager a vyžádat si $articleEntities pro tuhle $categoryEntity?
Omlouvám se, pokud jsem tohle přehlédl v předchozích článcích. Ale ani teď to tam nevidím.
Re: Doctrine 2: načítání, ukládání a mazání
Všechno tohle řeší Doctrine 2 pomocí asociací, kde načtení všech článků z dané kategorie zajistí sama, aniž bych musel explicitně volat nějaké
findBy()
v entitě kategorie.K asociacím se dostanu v přespříštím díle. Seriál musí mít pochopitelně nějaký postupný vývoj a nešlo zatím tak úplně psát o asociacích, pokud jsem se dosud nezmínil třeba o Entity Manageru. Takže trpělivost, na všechno dojde.
Re: Doctrine 2: načítání, ukládání a mazání
Díky za odpověď i seriál. Dost mi rozšiřuje obzory.
Díky za seriál
Děkuji autorovi za moc příjemné počtení, Doctrine 2 (oproti první verzi) se pro mě též začíná stávat velmi inspirativní. Tak už aby byla na světě stabilní verze :).
Dodatek k poslednímu odstavci
K poslednímu odstavci by bylo vhodné přidat hlavně důvod – a to výkon.
Doctrine vygeneruje potřebné dotazy k provedení flush() tak, abych jich bylo co nejméně. Např. rozšířené INSERTy, DELETE z jedné tabulky v jednom dotazu, etc.
Re: Dodatek k poslednímu odstavci
Tak on není důvodem jenom výkon (i když je velice důležitý). Stejně tak je třeba zajistit, aby se dotazy provedly ve správném pořadí či abychom nemuseli mít dlouho otevřené transakce.
Jedna instance na entitu
Pokud se Doctrine stará, aby měl jednu instanci na entitu, pak si vše drží až do ukončení? Jinak si to představit dost dobře nedovedu, v PHP neznám WeakReference apod.
Re: Jedna instance na entitu
Ano, všechny načtené instance entit jsou v Entity manageru po celou dobu běhu skriptu. Osobně v tom nevidím žádný problém.
Re: Jedna instance na entitu
V případě typického webového použití to problém obvykle opravdu není. Ale třeba u dávkového skriptu to problém být může.
Re: Jedna instance na entitu
Ano, to pak opravdu může být problém. Pokud bys chtěl mermomocí Doctrinu používat, tak pak můžeš clearovat entity manager a unsetovat nepotřebné instance. Nicméně z vlastní zkušenosti mohu doporučit v takovýhle případech se na Doctrine vykašlat a používat čisté SQL (třeba přes Doctrine DBAL). Za tu ztrátu výkonu práce s entitami IMHO ani trochu nestojí.
Random() v Doctrine 2
Existuje v Doctrine 2 nějaká obdoba funkce RANDOM() z Doctrine 1?
Z Doctrine teprve začínám a narazil na problém náhodného výběru kolekce objektů. Zatím jsem nenašel elegantní způsob jak toho docílit. Zjistil jsem, že v Doctrine 1 existovala funkce RANDOM, která ale v Doctrine 2 nelze využít.
Hledání podle nullové hodnoty
Super články!
Měl bych ale jeden dotaz – Jde pomocí entityManageru a metody findBy hledat sloupečky, které mají hodnotu NULL?
Díky;)