Doctrine2 LEFT JOIN z 2 warunkami
Próbuję znaleźć „Produkt” według ID, a do lewej dołączyć wszystkie „Zdjęcie” na dwóch warunkach: ustawienia regionalne I stan aktywny.
Oto mój QueryBuilder:
$queryBuilder = $this->createQueryBuilder('p')
->select('p, photos, photoTranslation')
->leftJoin('p.photos', 'photos')
->leftJoin('photos.translations', 'photoTranslation')
->where('p.id = :id')
->andWhere('(photoTranslation.locale = :locale OR photoTranslation.locale IS NULL)')
->andWhere('(photoTranslation.active = :active OR photoTranslation.active IS NULL)')
->setParameters(array(
'id' => $id
'locale' => $this->getLocale(),
'active' => true
));
Działa dobrze, gdy nie ma zdjęć lub występują AKTYWNE zdjęcia, ale nie wtedy, gdy nie ma nieaktywnego zdjęcia, ponieważ nie odpowiada jednemu z dwóch warunków.
Jeśli używam tylko jednego warunku, na przykład tylko części ustawień regionalnych, to działa dobrze:
$queryBuilder = $this->createQueryBuilder('p')
->select('p, photos, photoTranslation')
->leftJoin('p.photos', 'photos')
->leftJoin('photos.translations', 'photoTranslation')
->where('p.id = :id')
->andWhere('(photoTranslation.locale = :locale OR photoTranslation.locale IS NULL)')
->setParameters(array(
'id' => $id
'locale' => $this->getLocale()
));
Na razie zapętlam wyniki i wyłączam wszystkie nieaktywne zdjęcia ... ale chciałbym zrobić czysty sposób w QueryBuilderze.
Próbowałem też umieścić warunki w klauzuli LEFT JOIN:
->leftJoin('photo.translations', 'phototTranslation', Doctrine\ORM\Query\Expr\JOIN::WITH, 'photoTranslation.locale = :locale AND photoTranslation.active = :active')
Ale zawsze zwraca zdjęcie, nawet jeśli jest nieaktywne.