2013-08-30 28 views
16

Tôi đang cố tạo một truy vấn trong Doctrine 2, tìm tất cả các đối tượng Vacancy có liên quan đến bất kỳ đối tượng nào trong số các đối tượng VacancyWorkingHours nhất định.Học thuyết 2 WHERE IN khoản sử dụng tập hợp các thực thể

Các Vacancy thực thể trông như sau:

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

truy vấn của tôi hiện trông như sau, nhưng không có kết quả trả về vì mệnh đề where. Trong ví dụ này, $workingHours là một trường hợp Doctrine\Common\Collections\ArrayCollection chứa một số VacancyWorkingHours thực thể

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

Trả lời

20

Một pull request tôi đã thực hiện về vấn đề này đã được sáp nhập vào Học thuyết ORM 2,5, vì vậy bạn chỉ có thể làm điều này bây giờ:

thông số bộ sưu tập
$q = $this->createQueryBuilder('v') 
    ->select('v') 
    ->andWhere('v.workingHours IN (:workingHours)') 
    ->setParameter('workingHours', $workingHours); 
; 

Phiên bản mới nhất của Học thuyết cho phép bây giờ và sẽ tự động sử dụng các khóa chính của mỗi của các mục bộ sưu tập.

0

Tôi nghĩ rằng DQL sẽ làm việc tốt hơn cho điều đó.

$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

Cảm ơn, tôi có thể sẽ đi xuống tuyến đường đó. Mệnh đề WHERE IN cụ thể thực sự là một phần của truy vấn lớn hơn đang được xây dựng dựa trên các điều kiện khác nhau, do đó, việc sử dụng trình tạo truy vấn dễ dàng hơn từ quan điểm tổ chức. –

16

Cố gắng thiết lập ID như tham số

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

Sau đó

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

Cảm ơn, điều đó hoạt động. Có vẻ lạ/sai khi phải tham chiếu đến trường khóa mặc dù thay vì để Doctrine xử lý nó. –

+1

@JaikDean Có thực sự đó là lạ, và đó là lý do tại sao tôi đề xuất một bản vá để nâng cao điều này để nó hoạt động với các thực thể chứ không phải là id. Nó đã được hợp nhất và sẽ có sẵn trong Doctrine 2.5: https://github.com/doctrine/doctrine2/pull/590 –

+1

@ MichaëlPerrin Tin tốt! –

Các vấn đề liên quan