2013-01-08 11 views
5

Tôi có một đối tượng ArrayCollection của các đối tượng trạng thái mà bây giờ tôi muốn sử dụng làm tham số IN trong mệnh đề WHERE cho truy vấn doctrine. Đây là mã truy vấn của tôi:Sử dụng tính năng arraycollection làm tham số trong truy vấn doctrine

$query = $repository->createQueryBuilder('r') 
       ->join('r.applicationStatus', 's') 
       ->where('r.submitted IS NOT NULL') 
       ->andWhere('r.created >= :date')     
       ->andWhere('r.created < :date2') 
       ->andWhere('s IN (:status)') // Here's the In statement 
       ->orderBy('r.created', 'DESC')     
       ->setParameter('date', $appSearch->getDateFrom()) 
       ->setParameter('date2', $end) 
       ->setParameter('status', $appSearch->getApplicationStatus()) //Here's the array collection 
       ->getQuery(); 

Tuy nhiên, truy vấn không trả về 0 bản ghi. Để nó hoạt động, tôi phải lặp lại thủ công thông qua mảng $ appSearch-> getApplicationStatus() arraycollection và lấy id trạng thái trong một mảng mới cho truy vấn để mang lại kết quả chính xác vào lúc này - điều này cảm thấy rất không hiệu quả.

Tôi đang làm gì sai?

Trả lời

9

Bạn nên làm một cái gì đó như thế:

$statusId = array(); 

foreach ($appSearch->getApplicationStatus() as $status) { 
    $statusId[] = $status->getId(); 
} 

// ... Your query: 
->andWhere('s.id IN (:status)') 
->setParameter('status', $statusId) 

Trong thực tế, tôi nghĩ rằng học thuyết không thể lọc một cái gì đó bằng cách cho một đối tượng, nó không có khả năng để so sánh nó, vì vậy bạn cần phải sử dụng một lĩnh vực các đối tượng này, ở đây id trong ví dụ của tôi ... và so sánh số nguyên là nhẹ hơn cho cơ sở dữ liệu của bạn!

+0

lớp ArrayCollection có (rất thuận tiện) 'toArray' phương pháp để làm điều tương tự. – spdionis

+0

Thật đáng tiếc, vì Doctrine * có thể * chấp nhận một đối tượng như một tham số cho phép so sánh eq(), nhưng dường như không giống như một mảng các đối tượng. – darkbluesun

0

hoạt động tốt của nó trong contrioller.

$users = $em->getRepository('EventekUserBundle:User')->getQueryf($events->getSecretariats()->toArray()) ; 

trong repositroy =>

class UserRepository extends \Doctrine\ORM\EntityRepository 
{ 

    public function getQueryFromCollection($users) 
    { 
     $qb = $this->createQueryBuilder('u') 
      ->select('u') 
      ->andWhere('u in (:users)') 
      ->setParameter('users', $users); 
     return $qb->getQuery(); 
    } 
} 
Các vấn đề liên quan