Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][MySQL][doctrine] LEFT JOIN - nie zaciąga rekordu przy niespełnieniu warunku drugiej tabeli
mundeck
post 10.04.2017, 10:39:09
Post #1





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 2.09.2012

Ostrzeżenie: (0%)
-----


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ć?
Go to the top of the page
+Quote Post
robert0770
post 10.04.2017, 13:50:25
Post #2





Grupa: Zarejestrowani
Postów: 42
Pomógł: 1
Dołączył: 18.02.2015

Ostrzeżenie: (0%)
-----


daj jedno where() a w nim 2 reguły oddzielone 'or'

bez andWhere
Go to the top of the page
+Quote Post
mundeck
post 10.04.2017, 17:44:50
Post #3





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 2.09.2012

Ostrzeżenie: (0%)
-----


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ź
Go to the top of the page
+Quote Post
maly_swd
post 10.04.2017, 21:26:23
Post #4





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

Ostrzeżenie: (0%)
-----


  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. ;


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 7.06.2025 - 04:49