0

在 Symfony2 表单中,当尝试获取实体时,Symfony 期望接收 QueryBuilder 对象,但有时没有返回实体。在这种情况下,会出现一条错误消息:

“Doctrine\ORM\QueryBuilder”类型的预期参数,给出“NULL”

如何使 query_builder 允许没有可用实体的选项。

$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()方法

4

1 回答 1

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);
    ))
;
于 2013-06-29T21:26:30.340 回答