2013-08-30 4 views
16

Sto tentando di creare una query in Doctrine 2 che trova tutte le entità Vacancy correlate a una qualsiasi delle entità VacancyWorkingHours indicate.Doctrine 2 Clausola WHERE IN che utilizza una raccolta di entità

Il Vacancy entità si presenta come segue:

/** 
* 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 */ 
} 

La mia domanda al momento appare come segue, ma non ha prodotto alcun risultato a causa della clausola dove. In questo esempio, $workingHours è un'istanza Doctrine\Common\Collections\ArrayCollection contenente un numero di VacancyWorkingHours entità

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

risposta

20

Un pull request che ho fatto su questo è stata fusa per incorporazione in ORM Doctrine 2.5, in modo da poter semplicemente farlo ora:

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

L'ultima versione di Doctrine consente ora i parametri di raccolta e farà automaticamente l'uso della chiave primaria di ogni delle voci della collezione.

0

Credo che il DQL funzionerà meglio per questo.

$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

Grazie, potrei finire per percorrere quella strada. La particolare clausola WHERE IN fa effettivamente parte di una query più ampia che viene costruita in base a varie altre condizioni, quindi l'utilizzo del generatore di query è più semplice da un punto di vista organizzativo. –

16

tenta di impostare gli ID come parametro di

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

Poi

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

Grazie, funziona. Sembra strano/sbagliato dover fare riferimento al campo chiave piuttosto che lasciare che Doctrine lo gestisca. –

+1

@JaikDean Sì, in effetti è strano, ed è per questo che ho proposto una patch per migliorarla in modo che funzioni con le entità piuttosto che con gli id. È stato unito e sarà disponibile in Doctrine 2.5: https://github.com/doctrine/doctrine2/pull/590 –

+1

@ MichaëlPerrin Buone notizie! –