Doctrine2 LEFT JOIN with 2 conditions
Eu estou tentando encontrar um 'Produto' por ID, e para esquerda juntar tudo é 'foto' em duas condições: a localidade e o estado ativo.
Aqui está o meu 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
));
Funciona bem quando não há fotos ou quando há fotos ativas, mas não quando há uma foto inativa porque não corresponde a uma das duas condições.
Se eu usar apenas uma condição, por exemplo, apenas a parte do código de idioma, tudo funcionará bem:
$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()
));
Por enquanto, faço um loop nesses resultados e desfaz todas as fotos inativas ... mas gostaria de uma maneira limpa de fazer no QueryBuilder.
Eu também tentei colocar as condições na cláusula LEFT JOIN:
->leftJoin('photo.translations', 'phototTranslation', Doctrine\ORM\Query\Expr\JOIN::WITH, 'photoTranslation.locale = :locale AND photoTranslation.active = :active')
Mas sempre retorna a foto, mesmo que seja inativa.