Я пытаюсь найти «Продукт» по идентификатору и оставить все его «Фото» при двух условиях: локаль И активное состояние.
Вот мой 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 ));
Он отлично работает, когда нет фотографий или когда есть АКТИВНЫЕ фотографии, но не когда есть неактивная фотография, потому что она не соответствует ни одному из двух условий.
Если я использую только одно условие, например, только часть локали, все работает нормально:
$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() ));
На данный момент я зацикливаюсь на этих результатах и отключаю все неактивные фотографии ... но мне нужен чистый способ сделать это в QueryBuilder.
Я также попытался поставить условия в предложении LEFT JOIN:
->leftJoin('photo.translations', 'phototTranslation', Doctrine\ORM\Query\Expr\JOIN::WITH, 'photoTranslation.locale = :locale AND photoTranslation.active = :active')
Но он всегда возвращает фото, даже если оно неактивно.