Wpis z mikrobloga

@Klopsztanga: Też myślałem o tym, że to obrazki mogą powodować narastanie zapytań do DB. Hm… sytuacja jest taka, że Produkt ma wiele obrazków, a muszę wyświetlić tylko jeden. W tym celu, w encji Product stworzyłem metodę getMainImage(), która pobiera pierwszy obrazek z wielu, jako ten główny.
Hm… teraz akurat wpadłem na taką myśl, że wystarczy pobrać wszystkie obrazki korzystając z JOIN i w twigu użyć filter first, żeby uzyskać ten
  • Odpowiedz
@mariecziek: powinieneś utworzyć kolumnę $cover , gdzie przechowasz "thumbnail" dla produktu, czyli ten 1 obrazek. Zrób to teraz, zanim będzie za późno, bo będziesz żałować w późniejszym czasie - sprawdzone info
  • Odpowiedz
@mariecziek: joiny panie, joiny, poza tym jeśli to do wyświetlania ma być tylko to proponuje skorzystać z partiali i pozbyć się hydracji do obiektów(tj korzystać z Query::HYDRATE_ARRAY/getArrayResult)(a jeszcze lepiej HYDRATE_NONE jak nie masz joinów, co prawda musisz wtedy korzystać z nazw takich jak bazie ale jeszcze więcej zyskujesz na wydajności)

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/partial-objects.html
  • Odpowiedz
@Jurigag: Wiem, że joiny. Widzisz, myślałem, że w SF wystarczy opisać relacje w Encji i Joiny będą tworzone automatycznie, a okazuje się, że korzystajć z query buildera, muszę znowu pisać Joiny, bo zapytania do bazy danych rosną lawinowo.
  • Odpowiedz
@mariecziek: nie, nie musisz pisać "joinów" jako takich, ale musisz napisać że chcesz dołączyć coś, relacje są po to że nie musisz pisać warunków ON, dołączać modeli itp itd tylko robisz sobie po prostu:

->leftJoin('żródłojoina.cojoin','alias')
i tyle, cała reszta się dzieje tak jak napisałeś - automatycznie, skąd symfony(czy jakiwkolwiek inny język i fw) ma się domyśleć że będziesz uzyskiwał dostęp do tego cojoin ? ma sprawdzać to sobie w widoku
  • Odpowiedz
@mariecziek: no :P więc też robiłeś joina nie da się tego rozwiązać za bardzo żeby bez podawania joina samo go robiło xd a po co ma robić go zawsze jak niepotrzebne będzie
  • Odpowiedz
@Jurigag: Rozumiem. No a jeżeli chcę pobrać z bazy danych wszystkie rekordy używając findBy()? Np mam takie coś:

$product = $em->getRepository(Product::class)->findBy(['onSale' => true]);
Żeby zapobiec powielaniu się zapytań, muszę napisać własną metodę do pobierania danych?
  • Odpowiedz