2014-02-18 3 views
1

옵션에 따라 빌라를 필터링 할 수있는 웹 사이트를 구축 중입니다. 예를 들면 다음과 같습니다. 별장에는 Wi-Fi, 수영장, 동물 허용 옵션이 있습니다.Doctrine 2 manyToMany relation AND로 엔터티 선택

필터링 할 때 Wi-Fi 및 풀 옵션을 제공합니다. 이제는이 옵션들 모두에 기반한 빌라의 필터링 된 목록이 필요합니다. 그래서 Wi-Fi와 풀을 모두 갖춘 빌라를 원합니다.

class Object 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255) 
*/ 
private $name; 

/** 
* @ORM\manyToMany(targetEntity="Option", mappedBy="objects") 
*/ 
private $options; 

//... 
} 

그리고 내 옵션 엔티티는 다음과 같습니다 :

내 빌라 엔티티는 다음과 같습니다

class Option 
{ 

/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255) 
*/ 
private $tag; 

/** 
* @ORM\manyToMany(targetEntity="Object", inversedBy="options") 
* @ORM\JoinTable(name="Object_Options") 
*/ 
private $objects; 

//... 
} 

내가 필터링 할 필요가있는 필터 IDS $filters의 배열을 가지고있다.

나는 이것을 수행하는 방법을 알 수없는 것 같습니다.

는 지금이

$qb = $this->getEntityManager()->createQueryBuilder(); 
$qb->select("o")->from("Object", "o"); 

if ($filters && count($filters) > 0) { 
    $qb->innerJoin("o.options", "f"); 
    $qb->andWhere($qb->expr()->in("f.id", $filters)); 
} 

$query = $qb->getQuery(); 

이 있지만 이것은 실제로 내가 원하는 것과 반대를한다. 이 옵션에 따라 별장을 필터링하지만 AND 대신 OR를 사용합니다. 그래서 빌라가 Wi-Fi 또는 풀을 가지고있는 곳의 결과가 나옵니다.

그래서 의사에 내가 필요한 코드 :

get all Objects that have every given option (and maybe more) 

어느 한이 되거 수 있습니까?

+0

솔루션을 게시 해 주셔서 감사합니다. 그건 그렇고, 자신의 질문에 대답하고 답을 채점하는 것은 완벽합니다. 실제로 문제를 해결 된 것으로 표시하는 것이 더 좋습니다. –

+0

이 정보를 주셔서 감사합니다 Slava Formin II. 나는 보통의 포스터가 아니기 때문에 (매우 늦은 반응으로 볼 수 있듯이.) 그래서 나는 가능한 옵션을 알지 못했다. 감사. 그것이 너를 도왔 으면 좋겠다. –

답변

0

해결했다

알려줘야을, 그래서 나는 그것을 알아 냈다. 나는 내 IN 성명서로 바른 길을 가고 있었지만 조금 더 소금이 필요했습니다. 모든 옵션을 선택한 후에 분명히 필터 양이 지정한 필터 양과 같은지 확인해야합니다. MySQL에서이 단계를 시도했을 때 실제로 의미가있었습니다.

$qb = $this->getEntityManager()->createQueryBuilder(); 
$qb->select("DISTINCT o")->from("Object", "o"); 

if ($filters && count($filters) > 0) { 
    $qb->innerJoin("o.options", 
        "f", 
        "WITH", 
        "f.id IN (:filters)")->setParameter("filters", $filters); 

    $qb->groupBy("o.id"); 

    $qb->having("COUNT(DISTINCT f.id) = :count") 
     ->setParameter("count", count($filters)); 
}