教义 ORM 多对多通过标签列表找到所有内容



我有一个简单的m2m关系(书-> book_mark <-标记(。我想通过 1-2-3 查找项目(书籍(...标记(标记(的 X 计数。示例:Book1 获得以下标签:[Mark1, Mark2, Mark3],Book2 获得以下标签:[Mark1, Mark3, Mark4]。搜索列表为 [Mark1, Mark2]。我只想查找具有搜索列表中所有标签的项目,即在本例中仅查找 Book1。

我尝试了很多方法,花了很多时间谷歌它,但没有找到答案。

我最接近的是这个:

return $this->createQueryBuilder('b')
->select('b, m')
->leftJoin('b.marks_list', 'm')
->andWhere(':marks_list MEMBER OF b.marks_list')
->setParameter('marks_list', $marksList)
->getQuery()->getArrayResult();

但它正在寻找至少具有 1 个参数的书籍,而不是所有参数都在一起

接下来,我决定我绝对错了,并开始这样思考:

public function findAllByMarksList(array $marksList)
{
$qb = $this->createQueryBuilder('b')
->select('b, m')
->leftJoin('b.marks_list', 'm');
for ($i = 0; $i<count($marksList); $i++){
$qb->andWhere('m.id in (:mark'.$i.')')
->setParameter('mark'.$i, $marksList[$i]);
}
return $qb->getQuery()->getArrayResult();
}

但在这里我遇到了另一个问题:此代码仅检查 1 个标记,然后如果参数数量超过 1,则始终返回一个空集。 此致敬意。

所以,更新的答案...它有效(我在评论和品牌之间有很多关系(这是相同的情况,但例如,如果您有

第 1 册 - 标记 1、标记 2、标记 3

第 2 册 - 标记 1、标记 2、标记 3、标记4

使用此代码,您还可以找到 book2,因为所有标记都在此列表中。

如果您需要查找只有这 3 个标签的书籍,您还需要添加计数检查。(标签计数 = 标签列表计数(

public function test()
{
// just selecting for list for test
$brandsList = $this->_em->createQueryBuilder()
->select('b')
->from('ReviewsAdminBundle:Brands', 'b')
->where('b.id in (:brandIds)')
->setParameter('brandIds', [6,4])
->getQuery()
->getResult();
dump($brandsList);
// query part
$qb = $this->createQueryBuilder('r')
->select('r')
->leftJoin('r.brand', 'brands')
->where('r.published = 1');
foreach ($brandsList as $oneBrand) {
/** @var Brands $oneBrand */
$identifier = $oneBrand->getId();
$qb->andWhere(':brand'.$identifier.' MEMBER OF r.brand')
->setParameter('brand'.$identifier, $identifier);
}
dump($qb->getQuery()->getResult());
die;
}

此外,您可以检查 doctrine2 queryBuilder 必须仅返回与数组值 (ids( 匹配的结果:0/Null 和/或一个或多个 id(s( 必须返回一个结果(接近我们的情况(

而且,我认为没有更好的方法来实现这一目标。要么使用多个和位置来比较 ID 或使用 MEMBER OF

相关内容

  • 没有找到相关文章

最新更新