2014-12-03 6 views
1

나는 두 개의 항목 - 변호사와 범주가 있습니다. 그들은 Many to Many 협회와 연결되어 있습니다. 예시 변호사가 3 가지 카테고리를 가지고 있다고 가정하십시오. 나는 일련의 범주별로 변호사를 검색 할 수있는 기능을 만들고 싶습니다. 배열에서 모든 범주를 가진 변호사 만 반환해야합니다.Symfony 2, QueryBuilder, multiple 및 동일한 매개 변수가있는 곳

class Lawyer { 
    //... 
    /** 
    * @ORM\ManyToMany(targetEntity="Dees\KancelariaBundle\Entity\Category") 
    * @ORM\JoinTable(name="lawyers_has_categories", 
    *  joinColumns={@ORM\JoinColumn(name="lawyer_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")} 
    *) 
    * 
    * @var ArrayCollection 
    */ 
    protected $categories = null; 
    //... 
} 

class Category { 
    //... 
    /** 
    * @ORM\Column(length=255, nullable=true) 
    * 
    * @var string 
    */ 
    protected $name;  
    //... 
} 

public function searchLawyers(array $categories) { 
    $queryBuilder = $this->createQueryBuilder('lawyer') 
      ->join('lawyer.categories', 'category'); 

    $queryBuilder->andWhere("category.name = :category1"); 
    $queryBuilder->setParameter("category1", "First category");  

    $queryBuilder->andWhere("category.name = :category2"); 
    $queryBuilder->setParameter("category2", "Second category"); 
    //...  
    //won't work, return null, but lawyer with these categories exists. 
}  

어떻게하면됩니까?

답변

6

나는 그것을 알아 냈 :

public function searchLawyers(array $categories) { 
    $queryBuilder = $this->createQueryBuilder('lawyer') 
     ->join('lawyer.categories', 'category'); 

     $queryBuilder->andWhere("category.name in (:categories)"); 
     $queryBuilder->setParameter("categories", $categories); 

     $queryBuilder->addGroupBy("lawyer.id"); 

     $queryBuilder->andHaving("COUNT(DISTINCT category.name) = :count"); 
     $queryBuilder->setParameter("count", sizeof($categories)); 

    return $queryBuilder->getQuery()->getResult(); 
}