Doctrine - načtení první fotky z fotogalerie ve výpisu položek rubrika: Programování: PHP

Anonym
položil/-a 7.6.2013

V Doctrine mám entitu Article (bez újmy na obecnosti) a entitu Photo. Fotky jsou k článku připojeny asociací one to many. Ve výpisu článků chci zobrazit ke každému jednu fotku, nejlépe tu první.

Ovšem neumím to udělat elegantně na konstantní počet dotazů. Defaultně se při výpisu 20 článků pošle 20 dotazů na získání všech fotek pro jednotlivé články.

Napadá někoho nějaké pěkné řešení?

odkaz
8 Jakub Macek
odpověděl/-a 7.6.2013

Tady i záleží na databázi, na které to běží (u některých mohou být některé přístupy dost neefektivní). Osobně mám vyzkoušené dva postupy:

  1. Mám u fotek označeno, která se má načítat (něco jako typ = 'hlavni') a tahám to pomocí LEFT JOIN. Pokud se ale dostanou dvě "hlavní" fotky k článku, tak je to problém.
  2. Načítám nadvakrát - nejdříve články, které chci (zahrnuje stránkování apod.), a z nich vytáhnu seznam klíču, které použiju k načtení fotek přes WHERE article IN (1, 2, 3). Pak to spojím pomocí mapy (= asociativní pole, hashtabulka, apod.). Je to vcelku pružné a když je správny index, tak i skoro stejně efektivní jako JOIN.

Obojí ale jde proti použití ORM - tam by z principu bylo nutné pro každý článek načíst všechny fotky (tj. celou kolekci), jinak to nebude možné spravovat (pokud na to Doctrine nemá nějaký hack, tohle usuzuju z běžných principů, které se používají v ORM).

Komentáře

  • Honza Břešťan : Podobny postup pouzivam docela casto i s ORM. Pokud neni roundtrip do DB moc drahy (treba kdyz to je dokonce na jednom stroji), muze to navic byt i efektivnejsi, nez to cele nechat na ORM, protoze ty generovane dotazy jsou obecne dost silene. Na druhou stranu nektera ORM (aspon ty v .NETu) umoznuji operace jako "Include", ktere zajisti jenom jedno natazeni tech fotek do pameti a tim padem to taky zvladne behem jednoho nebo dvou dotazu. Ne vzdycky ten Include ale jde pouzit a ne vsude ta moznost vubec je. 8.6.2013
  • Jakub Macek : Ano, ovšem je tam ta nevýhoda, že se načtou všechny fotky právě pomocí LEFT JOIN. Na druhou stranu pokud je to na stejném stroji, není těch záznamů moc a neočekává se velká zátěž, tak se nevyplatí moc to komplikovat, protože to zvyšuje náklady na další údržbu. 9.6.2013
  • Petr Voneš : Generovane dotazy vypadaji nekdy silene, ale kdyz si porovnam execution plan s temi co bych napsal rucne "lepe", tak se obcas divim ze tak spatne nejsou :-) Tady asi nebude vykonovy problem ani tak v tom dotazu, jako nacitani obrazku (BLOB field) z databaze. Pokud jsou to jen male nahledy tak budiz, u vetsich objemu se vyplati je ukladat externe do file systemu. Nevim jestli je mozne tu databazi rozsirit, ale slo by rozsirit Photo o nejaky flag 'preview' ? Podle neho by to pak slo snadno. 9.6.2013

Pro zobrazení všech 6 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.