Próbuję znaleźć "Produkt" według identyfikatora, a do lewej dołączyć wszystkie "zdjęcie" na dwóch warunkach: locale I stan aktywny.Doctrine2 LEWE DOŁĄCZ z 2 warunkami
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 ));
To działa dobrze, gdy nie ma żadnych zdjęć lub gdy nie są aktywne zdjęcia, ale nie wtedy, gdy jest nieaktywny zdjęcie, ponieważ nie pasuje do jednej z dwa warunki.
Jeśli używam tylko jeden warunek, na przykład tylko część locale, 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 ja tez pętla na wynikach i Usuń wszystkie zdjęcia ... ale nieaktywnych Chciałbym zrobić czysty sposób w QueryBuilder.
Próbowałem też umieścić warunki na LEFT JOIN klauzuli:
->leftJoin('photo.translations', 'phototTranslation', Doctrine\ORM\Query\Expr\JOIN::WITH, 'photoTranslation.locale = :locale AND photoTranslation.active = :active')
Ale ona zawsze wraca na zdjęciu, nawet jeśli jest nieaktywny.
Niestety, zarówno warunki "aktywne", jak i "locale" są w tym przypadku wymagane. – Tiois
@Tiois Czy możesz dodać małą próbkę każdego stołu i oczekiwanych rezultatów? To może pomóc sobie i innym lepiej dostrzec potencjalny problem. – Shawn
orW przypadku uzyskania wyników WTF zaleca się, aby go nie używać. – Hornth