2016-09-19 14 views
0

私は関係ManyToMantの写真とタグを持っていて、いくつかのタグIDを持っている写真を見つける必要がありますが、私は2つのタグid(1,2) ID 1のタグを持つ写真。タグIDがいくつかある写真を見つけるには?Symfony Doctrine ManyToMany関係を使ってクエリを作成する

は私のエンティティthisis

class Photo 
{ 
use Timestampable; 

/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* @Annotation\Groups({ 
*  "get_photo" 
* }) 
*/ 
private $id; 

/** 
* @var Tags[]|ArrayCollection 
* @ORM\ManyToMany(targetEntity="Tags", inversedBy="photo") 
* @Annotation\Type("Relation<AppBundle\Entity\Tags>") 
* @Annotation\SerializedName("tag_ids") 
* @Annotation\Accessor(setter="setSerializedTag") 
* @Annotation\Groups({ 
*  "post_photo", "get_photo", "put_photo" 
* }) 
*/ 
protected $tags; 

とタグ

class Tags 
{ 
use Timestampable; 

/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* @Annotation\Groups({"get_tag"}) 
*/ 
private $id; 

/** 
* @var Photo[]|ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="Photo", mappedBy="tags") 
*/ 
protected $photo; 

$parameterBag->get('tag_ids')例では、私のクエリ、[1、2]:

/** 
* {@inheritdoc} 
*/ 
public function getPhotoByParameters(
    ParameterBag $parameterBag,   
) { 
    $em = $this->getEntityManager(); 
    $qb = $em->createQueryBuilder(); 
    $qb 
     ->select('p') 
     ->from('AppBundle:Photo', 'p') 
     ->leftJoin('p.tags', 't'); 

    if ($parameterBag->get('tag_ids') !== null 
     && is_array($tagIds = $parameterBag->get('tag_ids')) 
    ) { 
     $qb->andWhere($qb->expr()->in('t.id', $parameterBag->get('tag_ids'))); 
    } 

    $query = $qb->getQuery(); 
    $results = $query->getResult(); 

    return $results; 
} 

結果に私が持っている必要があります後タグ1とタグID 2を持つ写真。id 1のタグだけでなく、2

のタグ

ときに」のようなものを持っている。このようにしようとすると、GET = 1つの、タグID、私は私の写真

をして応答を持っているときに私は、0写真(GET> 1タグID)を持っている

  $andX = $qb->expr()->andX(); 
     foreach ($tagIds as $id) { 
      $andX->add($qb->expr()->eq('t.id', $id)); 
     } 
     $qb->andWhere($andX); 

してみてくださいクエリ

+0

この 'IS_ARRAYを(持っている場合は、実施例1及び2

  • その後、私はチェックを$ tagIds = $ parameterBag-> get( 'tag_ids') 'は醜いです。 – keyboardSmasher

  • +1

    @keyboardSmasherこのパラメータをもっときれいにするためのあなたの提案は何ですか? –

    +0

    私はそれが変数を定義する地獄であると言っています。 – keyboardSmasher

    答えて

    0

    からタグIDに以上、私は私の問題を解決した」

     $orX = $qb->expr()->orX(); 
         foreach ($tagIds as $id) { 
          $orX->add($qb->expr()->eq('t.id', $id)); 
         } 
         $qb->andWhere($orX); 
    

    写真

    最初
     if ($parameterBag->get('tag_ids') !== null 
         && is_array($tagIds = $parameterBag->get('tag_ids')) 
        ) { 
         $qb->andWhere($qb->expr()->in('t.id', $parameterBag->get('tag_ids'))); 
         $qb->groupBy('p.id'); 
         $qb->having('COUNT(t.id) = :tagIds'); 
         $qb->setParameter('tagIds', count($parameterBag->get('tag_ids'))); 
        } 
    
    1. 私はいくつかのタグIDを持つすべての写真をフィルタする - その後、写真がexectly量

    のthatsすべて