2013-06-29 38 views
0

在Symfony2表單中,當試圖獲取實體時,Symfony希望接收QueryBuilder對象,但有時候沒有返回實體。在這種情況下,出現一條錯誤消息:Symfony2表單query_builder - 允許爲null

預期類型的​​參數「學說\ ORM \ QueryBuilder的」,因爲

如何使query_builder允許選項,沒有可用的實體「NULL」 。

$builder 
    ->add('client', 'entity', array(
     'class'   => 'Faktura\FakturaBundle\Entity\Client', 
     'query_builder' => function(\Web\MyBundle\Repository\ClientRepository $er) use ($company){ 
      return $er->getClients($company); 
    )) 
; 

ClientRepository.php

public function getClients($company) 
{ 
    $qb = $this->createQueryBuilder('c') 
     ->select('c') 
     ->where('c.company = :company') 
     ->setParameter('company', $company) 
     ->getQuery(); 

    return $qb->getResult(); 
} 

其實,這只是基本的$er->findBy(array('company' => $company))方法 但我使用自定義getClients()方法

+0

這裏貼上'''getClients'''的主體。 –

回答

6

閉包應該返回QueryBuilder的對象,而不是它的結果。

ClientRepository應該是這樣的:

public function getClients($company) 
{ 
    $qb = $this->getClientsQueryBuilder($company); 
    return $qb->getQuery()->getResult(); 
} 

public function getClientsQueryBuilder($company) 
{ 
    return $this->createQueryBuilder('c') 
     ->select('c') 
     ->where('c.company = :company') 
     ->setParameter('company', $company); 

} 

然後你需要在你的封閉使用getClientQueryBuilder

$builder 
    ->add('client', 'entity', array(
     'class'   => 'Faktura\FakturaBundle\Entity\Client', 
     'query_builder' => function(\Web\MyBundle\Repository\ClientRepository $er) use ($company){ 
      return $er->getClientsQueryBuilder($company); 
    )) 
; 
+0

偉大的抓人! – phpsherpa