I try to find the "Product" by identifier, and on the left - all this is "Photo" in two conditions: locale AND active state.
Here is my 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
));
It works great when there are no photos or when there are ACTIVE photos, but not when there is an inactive photo, because it does not meet one of two conditions.
If I use only one condition, for example, only the local part, it works fine:
$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()
));
Now I will loop the abstract results and cancel all inactive photos ... but I need a clean way to do it in QueryBuilder.
I also tried putting conditions in a LEFT JOIN clause:
->leftJoin('photo.translations', 'phototTranslation', Doctrine\ORM\Query\Expr\JOIN::WITH, 'photoTranslation.locale = :locale AND photoTranslation.active = :active')
But he always returns the photo, even if it is inactive.