2016-11-04 48 views
1

我有实体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()->*方法实现此查询?

+0

也许'having'条款将帮助。例如:'$ this-> createQueryBuilder('service') - > leftJoin('service.tagList','tag') - > having('tag.id IN(:ids)') - > setParameter('ids',爆炸(“,”,$ tagList));' – rokas

+0

正如你发现的,IN选择任何。你需要做的是对$ tagList进行foreach,并为每个标签添加一个andWhere/setParameter,以便最终使用WHERE tag.id =? AND tag.id =?等总是使用参数来防止SQL注入。 – Cerad

回答

0

his comment建议的Cerad,你必须添加一个where/andWhere条件每个标签的检索与所有标签的服务(S):

$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++; 
} 
+0

@blahblah对你有帮助吗? – Veve