Używam Doctors Builder w Symfony2, aby utworzyć zapytanie do pobierania encji.Warunek łączenia lewy ON I składnia warunek inny w Doctrine
Mój bieżący kod wygląda następująco:
$repository = $this->getDoctrine()->getRepository('AaaBundle:Application');
$queryBuilder = $repository->createQueryBuilder('a');
$queryBuilder
->addSelect('u')
->addSelect('i')
->orderBy('a.created_date', 'DESC')
->leftJoin('a.created_by', 'u')
->leftJoin('a.installations', 'i')
//->where('i.page = :page')
//->setParameter('page', $found)
;
Teraz mogę to wykorzystać, aby uzyskać wszystkie strony, niezależnie od ich konieczności instalacji czy nie. Ale chcę tylko dołączyć do nich, jest dostępna strona $found
(tak, że jeśli jest instalacja dla aplikacji, ale jest na innej stronie, instalacja nie będzie dołączona). Jeśli dodaję klauzul where, będą wyświetlane tylko aplikacje z instalacją strony. Chcę wszystkie aplikacje z lub bez instalacji dla strony.
W SQL można uzyskać to poprzez dodanie AND
do łączenia
LEFT JOIN installations i ON a.id = i.app AND i.page = :page
ten sposób uzyskać informacje o instalacji dla aplikacji, która ma instalację na stronie, ale pojawia się wartości null w kolumnach dla aplikacje, które mają instalacje na innych stronach lub wcale.
Czy jest jakiś sposób, aby to zrobić w Doctrine, czy lepiej byłoby po prostu uzyskać wszystkie instalacje dla każdej aplikacji, a następnie sprawdzić na stronie z php?
Używam DQL zamiast, a WITH słowo kluczowe może być stosowany również tam, zaraz po klauzuli przyłączenia. –
Możesz oprzeć się bardziej na konstruktorze zapytań w ten sposób. '-> leftJoin ('a.installations', 'i', Expr \ Join :: WITH, $ qb-> expr() -> eq ('i.page', ': page')) -> setParameter ('strona', $ strona); ' –
W celu dokładności:" Expr \ join "pochodzi z" Doctrine \ ORM \ Query \ Expr " – Delphine