2013-08-30 9 views
16

Próbuję utworzyć zapytanie w Doctrine 2, które znajduje wszystkie encje Vacancy, które są powiązane z dowolną z podanych VacancyWorkingHours encji.Doctrine 2 GDZIE W klauzuli używającej kolekcji podmiotów

Podmiot Vacancy wygląda następująco:

/** 
* Vacancy 
* 
* @ORM\Table(name="vacancy") 
* @ORM\Entity(repositoryClass="JaikDean\CareersBundle\Entity\VacancyRepository") 
*/ 
class Vacancy 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var VacancyWorkingHours 
    * 
    * @ORM\ManyToOne(targetEntity="VacancyWorkingHours", inversedBy="vacancies") 
    * @ORM\JoinColumn(name="vacancy_working_hours_id", referencedColumnName="id") 
    **/ 
    private $workingHours; 

    /* Other fields and methods are inconsequential */ 
} 

Moja kwerenda aktualnie wygląda następująco, ale nie zwraca żadnych wyników ze względu na klauzulę WHERE. W tym przykładzie $workingHours jest instancją Doctrine\Common\Collections\ArrayCollection zawierający szereg VacancyWorkingHours podmiotów

$q = $this->createQueryBuilder('v') 
    ->select('v') 
    ->andWhere('v.workingHours IN (:workingHours)') 
    ->setParameter('workingHours', $workingHours->toArray()); 
; 

Odpowiedz

20

pull request zrobiłem ten temat został włączony do Doctrine ORM 2.5, więc można po prostu to zrobić teraz:

$q = $this->createQueryBuilder('v') 
    ->select('v') 
    ->andWhere('v.workingHours IN (:workingHours)') 
    ->setParameter('workingHours', $workingHours); 
; 

Najnowszą wersję Nauki umożliwia obecnie parametry zbierania i będzie automatycznie korzystać z klucza podstawowego każdego wpisów kolekcji.

0

Myślę DQL będzie działać lepiej za to.

$em = $this->getDoctrine()->getEntityManager(); 
$query = $em->createQuery(
    'SELECT v 
    FROM YourAppYourBundle:YourEntity v // exemple AcmeexampleBundle:YourEntity 
    WHERE v.workingHours IN :workingHours' 
)->setParameter('workingHours', $workingHours->toArray()); 

$vacancies = $query->getResult(); 
+0

Dzięki, mogłem skończyć zjeżdżaniem na tej trasie. Konkretna klauzula WHERE IN jest częścią większego zapytania, które jest budowane na podstawie różnych innych warunków, więc użycie konstruktora zapytań jest łatwiejsze z organizacyjnego punktu widzenia. –

16

spróbuj ustawić identyfikatory jako parametr

$ids = array(); 
foreach($workingHours as $w) { 
    $ids[] = $w->getId(); 
} 

Następnie

$q = $this->createQueryBuilder('v') 
    ->select('v') 
    ->andWhere('v.workingHours IN (:workingHours)') 
    ->setParameter('workingHours', $ids); 
; 
+1

Dzięki, że działa. Wydaje się, że dziwne/błędne jest odwoływanie się do kluczowego pola, zamiast pozwalać Doctrine na jego obsługę. –

+1

@JaikDean Tak, rzeczywiście, jest to dziwne i dlatego zaproponowałem poprawkę, aby poprawić to tak, aby działało z jednostkami zamiast identyfikatorów. Został scalony i będzie dostępny w Doctrine 2.5: https://github.com/doctrine/doctrine2/pull/590 –

+1

@ MichaëlPerrin Dobre wiadomości! –