多対多の関係を持つエンティティ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()->*
メソッドでこのクエリを実装できますか?
多分 'having'句が役立ちます。例: '$ this-> createQueryBuilder( 'service') - > leftJoin( 'service.tagList'、 'tag') - >( 'tag.id IN(:ids)') - > setParameter( 'ids'、 explode( "、"、$ tagList)); ' – rokas
あなたが発見したように、INはanyを選択します。あなたがする必要があるのは、$ tagListをforeachして、各タグにandWhere/setParameterを追加して、WHERE tag.id =になるようにすることです。 AND tag.id =?等。そして、常にSQLインジェクションから保護するためにパラメータを使用してください。 – Cerad