Я ищу функцию Doctrine, которая помогает запросить связанный код:
select pt.product_id from product_taxon pt
join product_taxon pt2 on pt.product_id=pt2.product_id and pt2.taxon_id = 101
where pt.taxon_id = 47;
это означает выбор всех элементов, которые имеют таксон с идентификатором 101 И таксон с id 47, другими словами, имеют таксоны 101 и 47 одновременно.
Я попытался использовать IN(), но он выбирает элементы, которые могут иметь только один из 47 и 101 идентификаторов таксонов.
Один канонический способ использования использует агрегацию:
SELECT
pt.product_id
FROM product_taxon pt
INNER JOIN product_taxon pt2
ON pt.product_id = pt2.product_id
WHERE pt2.taxon_id IN (101, 47)
GROUP BY pt.product_id
HAVING COUNT(DISTINCT pt2.taxon_id) = 2;
Благодаря @Tim Biegeleisen, он успешно конвертировал его в Doctrine QueryBuilder:
$queryBuilder = $this->createQueryBuilder('o')
// fluent methods with conditions which are not related to problem
->setParameter('locale', $locale)
->setParameter('channel', $channel);
$in = $this->createQueryBuilder('k')
->select('pt5.id')
->leftJoin('k.productTaxons', 'pt4')
->innerJoin('k.productTaxons', 'pt3')
->leftJoin('pt4.product', 'pt5')
->andWhere('pt3.taxon IN (:taxons)')
->addGroupBy('pt4.id')
->having('COUNT(DISTINCT pt3) = :count')
;
$queryBuilder
->andWhere(
$queryBuilder->expr()->in('o.id', $in->getDQL())
)
->setParameter('count', count($taxonsArr))
->setParameter('taxons', $taxonsArr);