我有实体 Service
和实体 Tag
,它们具有多对多关系。我怎样才能获得具有所有提供标签的服务
?
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 - 学说查询 : find entity that contains array in many-to-many association,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40420020/