2016-09-19 99 views
0

我有關係ManyToMant照片和標籤,我需要找到照片具有exectly一些標籤ID,我嘗試「在」的功能,但是當我發送兩個標籤ID(1,2)我已創建查詢照片,其中有一個標籤與ID 1.如何找到照片,只有一些標籤id?Symfony的主義與多對多關係

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 exanple不僅標籤或2

當嘗試

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

我有0照片時(GET> 1標籤ID),當GET = 1點標籤的ID我有我的照片

響應時嘗試這樣有一些像」 「

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

照片誰對或多個標籤ID從查詢

+0

這'is_array( $ tagIds = $ parameterBag-> get('tag_ids')'很醜。 – keyboardSmasher

+1

@keyboardSmasher你的命題更漂亮這個參數是什麼? –

+0

我只是說這是一個定義變量的地方。 – keyboardSmasher

回答

0

我解決我的問題

 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 - 例如1和2
  2. 然後我檢查,如果再光有exectly量

多數民衆贊成