我正在搜索有助于查询相关代码的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;
表示选择所有具有id为101的分类单元和具有id 47的分类单元的元素,换句话说,同时具有分类单元101和47。
我尝试使用IN(),但它选择的元素只能包含47个和101个分类单元ID中的一个。
答案 0 :(得分:1)
这样做的一种规范方法是使用聚合:
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;
答案 1 :(得分:0)
感谢@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);