2013-08-30 47 views
16

我試圖在第2學說中建立一個查詢,查找與任何給定VacancyWorkingHours實體相關的所有Vacancy實體。學說2 WHERE IN子句使用實體集合

Vacancy實體如下所示:

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

我的查詢目前看起來如下,但返回因爲where子句的任何結果。在這個例子中,$workingHours是包含許多VacancyWorkingHours實體

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

回答

20

pull request我這個做已併入學說ORM 2.5,所以你可以簡單地做到這一點現在:

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

主義的最新版本現在允許採集參數,並會自動使用每個主鍵的收集條目。

0

的我覺得DQL將努力爲更好Doctrine\Common\Collections\ArrayCollection實例。

$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

謝謝,我最終可能會走下那條路。特定的WHERE IN子句實際上是基於各種其他條件構建的更大查詢的一部分,因此從組織角度來看,使用查詢生成器更容易。 –

16

嘗試設置ID作爲參數

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

然後

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

謝謝,這是有效的。似乎奇怪/錯誤必須引用關鍵字段,而不是讓Doctrine處理它。 –

+1

@JaikDean確實很奇怪,這就是爲什麼我提出了一個補丁來加強這個功能,以便它能夠與實體而不是ID一起使用。它已被合併,並將在Doctrine 2.5中可用:https://github.com/doctrine/doctrine2/pull/590 –

+1

@MichaëlPerrin好消息! –