Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][MySQL][doctrine] LEFT JOIN - nie zaciąga rekordu przy niespełnieniu warunku drugiej tabeli
Forum PHP.pl > Forum > PHP > Frameworki
mundeck
Mam w Symfony entity Product oraz Version - każdy produkt może posiadać wiele wersji, relacja one to many. W aplikacji wyświetlam tabelę produktów - w nagłówkach są dane z entity Product, a po kliknięciu z nagłówek pojawiają się dane poszczególnych wersji. Chciałbym, żeby nagłówek z danymi Product był wyświetlany nawet jeśli produkt nie posiada żadnych wersji. Problem w tym, że nie usuwam danych z bazy, a jedynie ustawiam pole "deleted_at" z datą usunięcia i przy zaciąganiu produktów do tabeli - jeśli nie chcę wyświetlać usuniętych wersji - to nie wyświetla mi się pusty produkt. Zapytanie wygląda tak:

  1. $products = $qb->select('p')
  2. ->from('MainBundle:Product', 'p')
  3. ->leftJoin('MainBundle:Version', 'v', 'WITH', 'p.id = v.product_id')
  4. ->where('p.deleted_at IS NULL')
  5. ->andWhere('v.deleted_at IS NULL')
  6. ->groupBy('p.id')
  7. ->getQuery()
  8. ->getResult(Query::HYDRATE_OBJECT)
  9. ;


Jeżeli wszystkie wersje są usunięte, to produkt nie zostanie wyświetlony, z kolei jeśli usunę warunek nałożony na wersje, to zostanie wyświetlony wraz z wersjami usuniętymi, co też nie powinno się zdarzyć. Początkowo oczekiwałem, że niespełnienie warunku przy drugiej tabeli zadziała tak, jakby nie było w niej dopasowania (wstawi nulle), tylko że to dopasowanie jest, ale niespełnienie warunku powoduje niepobranie całego rekordu. Myślałem o tym, żeby pobierać same produkty, a dopiero w Twigu nałożyć warunek "if version.deleted_at is null", ale z tego co czytałem powinno się unikać tego typu rozwiązań, gdyż wtedy kierowane są za każdym razem nowe, osobne zapytania do bazy ( do każdej wersji).
Co można poradzić?
robert0770
daj jedno where() a w nim 2 reguły oddzielone 'or'

bez andWhere
mundeck
Hmmm... to dość ciekawy pomysł, niby oczywisty, ale nie pomyślałem o tym wcześniej, bo to zakłada, że będą wyświetlone produkty, które same zostały usunięte, ale mają jedną wersję nieusuniętą. Teoretycznie aplikacja nie powinna dopuszczać do takich sytuacji (usunięcie produktu powoduje usunięcie wszystkich wersji) ale na wszelki wypadek nie powinna też dopuszczać do wyświetlania się, jeśli ta reguła zostałaby w jakiś sposób złamana. Spróbuję może "skomplikować" zapytanie tak żeby wyszło że "wilk syty i owca cała". Thx za podpowiedź
maly_swd
  1. $products = $qb->select('p')
  2. ->from('MainBundle:Product', 'p')
  3. ->leftJoin('MainBundle:Version', 'v', 'WITH', 'p.id = v.product_id and v.deleted_at IS NULL')
  4. ->where('p.deleted_at IS NULL')
  5. ->groupBy('p.id')
  6. ->getQuery()
  7. ->getResult(Query::HYDRATE_OBJECT)
  8. ;
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.