2013-01-08 10 views
5

私は、DoctrineクエリのWHERE句でINパラメータとして使用したいステータスオブジェクトのArrayCollectionを持っています。クエリコードはDoctrineクエリのパラメータとしてarraycollectionを使用する

$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(); 

ですが、クエリではゼロレコードが返されます。それを動作させるには、$ appSearch-> getApplicationStatus()のarraycollectionを手作業で反復し、ステータスIDを新しい配列に入れて、結果が正しい結果を得るようにする必要があります。これは非常に非効率的です。

私は間違っていますか?

答えて

9

あなたはそのような何かをする必要があります

が実際に
$statusId = array(); 

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

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

私はDoctrineはオブジェクトを与えることによって何かをフィルタリングすることができないと思いますが、のフィールドを使用する必要があるので、それを比較することはできませんこれらのオブジェクトは、ここで私の例ではid ...そして、integerを比較することはあなたのデータベースにとってより軽いです!

+0

のArrayCollectionクラスの

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

同じことを行うには(非常に便利) 'toArray'方法があります。 – spdionis

+0

Doctrine *はeq()比較のパラメータとしてオブジェクトを受け入れることができますが、オブジェクトの配列が好きではないようです。 – darkbluesun

0

その作業は細かいです。 はcontriollerです。 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(); 
    } 
} 
関連する問題