Doctrine select元素包含所有指定的值

时间:2018-04-16 13:13:38

标签: mysql symfony doctrine

我正在搜索有助于查询相关代码的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中的一个。

2 个答案:

答案 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);