2016-11-04 14 views
1

多対多の関係を持つエンティティServiceとエンティティTagがあります。提供されたタグをすべて持っているServiceを入手するにはどうすればよいですか?Doctrineクエリ:多対多関連で配列を含むエンティティを見つけよう

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') - >( 'tag.id IN(:ids)') - > setParameter( 'ids'、 explode( "、"、$ tagList)); ' – rokas

+0

あなたが発見したように、INはanyを選択します。あなたがする必要があるのは、$ tagListをforeachして、各タグにandWhere/setParameterを追加して、WHERE tag.id =になるようにすることです。 AND tag.id =?等。そして、常にSQLインジェクションから保護するためにパラメータを使用してください。 – Cerad

答えて

0

his commentCeradによって示唆されるように、あなたはすべてのタグでのサービス(複数可)を取得するために、タグごとに/ 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++; 
} 
+0

@blahblahはあなたを助けましたか? – Veve

関連する問題