原则查询:查找包含多对多关联数组的实体


Doctrine query: find entity that contains array in many-to-many association

我有实体Service和实体Tag,它们具有多对多关系。我怎么能得到Service有所有提供的标签?

class Service{
      /**
      * @ORM'ManyToMany(targetEntity="Tag", mappedBy="serviceList")
      */
     private $tagList;
}

class Tag{
     /**
      * @ORM'ManyToMany(targetEntity="Service", inversedBy="tagList")
      * @ORM'JoinTable(name="tags_services")
      */
      private $serviceList;
}

现在在ServiceRepository中我这样做:

 $qb = $this->createQueryBuilder('service');
 $qb->leftJoin('service.tagList', 'tag');
 $tagArray = explode(",", $tagList);
 $qb->expr()->in('tag.id', $tagArray);

但是这个查询返回的服务至少有一个所提供的标签,而不是全部。

是否有可能实现这个查询与$qb->expr()->*方法?

正如Cerad在他的评论中建议的那样,您必须为每个标记添加where/andWhere条件来检索具有所有标记的服务:

$qb = $this->createQueryBuilder('service');
$qb->leftJoin('service.tagList', 'tag');
$tagArray = explode(",", $tagList);
$i = 0;
foreach($tagArray as $tag){
    if($i == 0){
        $qb->where('tag.id = :tag'.$i);
    } else {
        $qb->andWhere('tag.id = :tag'.$i);
    }
    $qb->setParameters('tag'.$i, $tag);
    $i++;
}