我有实体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中的his comment所建议,您必须为每个标签添加一个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++;
}

关于php - 教义查询:查找包含多对多关联中的数组的实体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40420020/

10-16 14:50
查看更多