在一对多情况下具有 ID 数组的查询生成器

Querybuilder with array of Id's in a one to many situation

我正在使用 Symfony 3.4 及其原则查询生成器。我有一个实体广告,它在一个太多的关系中有不同的选择。因此我正在构建一个过滤器。

$optionIds 是一个包含多个整数的数组,表示 option.id

我有以下过滤器:

            $query->leftJoin('ad.options', 'opt')
            ->andWhere($query->expr()->in('opt.id', ':optionIds'))
            ->setParameter('optionIds', $optionIds)

此过滤器的问题在于 return 所有广告都链接了其中一个选项。这个想法是只获取所有 id 都已链接的广告。所以这个过滤器是 OR 而不是 AND 过滤器?

第二个问题是,如果它匹配多个选项 ID,它会 return 多次出现相同的广告。我不想使用 groupBy 来解决这个问题。

我也把代码改成下面这样:

         $cnt = 0;
        foreach ($optionIds as $optionId) {
            $query->leftJoin('ad.options', 'opt'.$cnt)
                ->andWhere('opt'.$cnt.'.id = :id'.$cnt)
                ->setParameter('id'.$cnt++, $optionId);
        }

这有效,但速度很慢。

感谢帮助,我已经卡了半天了!

要检查广告是否应存在所有选项,您需要对聚合结果使用聚合和过滤器

$query->addSelect('COUNT(DISTINCT opt.id) AS total_options')(
      ->leftJoin('ad.options', 'opt')
      ->andWhere($query->expr()->in('opt.id', ':optionIds'))
      ->addGroupBy('ad.id')
      ->having('total_options = '.count($optionIds))
      ->setParameter('optionIds', $optionIds)

有关多对多关系中类似情况的参考和更多详细信息,请参阅我的其他答案

Symfony2 - Doctrine2 QueryBuilder WHERE IN ManyToMany field