在一对多情况下具有 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
我正在使用 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