Доктрина выбора элементов, где содержатся ВСЕ указанные значения

0

Я ищу функцию 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 идентификаторов таксонов.

Теги:
doctrine

2 ответа

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню