我正在尝试根据收集的用户创建一个具有集合类型数据的表单。我正在关注this chapter of the Symfony cookbook

query_builder选项是一个从DQL获取数据的闭包时,一切正常。由于需要从代码的不同位置获取数据,因此,我希望在Repository类中定义查询。

这是我的存储库中的函数:

public function findOwnedBy($user) {
    $query = $this->getEntityManager()->createQuery("SELECT l FROM MyBundle:Article a JOIN a.owndBy u WHERE u.id = :userId");
    $query->setParameters(array("userId"=>$user->getId()));
    return $query->getResult();
}


在Controller中调用此函数并返回Article数组时,此函数有效。这是symfony doc的片段:

$formOptions = array(
                    'class' => 'Acme\DemoBundle\Entity\User',
                    'multiple' => false,
                    'expanded' => false,
                    'property' => 'fullName',
                    'query_builder' => function(EntityRepository $er) use ($user) {
                        // build a custom query, or call a method on your repository (even better!)
                    },
                );


当我在query_builder中调用存储库函数时,出现错误:Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given,因为我的存储库返回一个Entity数组,而不是QueryBuilder数组,所以我可以理解。

我不想复制代码并在Form中创建一个新的QueryBuilder。使用存储库中的查询的最佳实践是什么?我当时在考虑在存储库中有两个功能,一个函数返回一个数组,另一个函数返回QueryBuilder,但是Symfony doc中的注释“或在您的存储库上调用一个方法(甚至更好!)”让我认为有一种更好的方法案件。

最佳答案

应该很容易。请执行下列操作:

public function queryOwnedBy($user) {

    $query = $this->createQueryBuilder('a')
            ->from('MyBundle:Article', 'a')
            ->innerJoin('a.owndBy', 'u')
            ->where('u.id = :id')
            ->setParameter('id', $user->getId());

    return $query;
}

public function findOwnedBy($user) {
    return $this->queryOwnedBy($user)
            ->getQuery()
            ->getResult();
}


然后在表单生成器中:

$formOptions = array(
    'class' => 'Acme\DemoBundle\Entity\User',
    'multiple' => false,
    'expanded' => false,
    'property' => 'fullName',
    'query_builder' => function(EntityRepository $er) use ($user) {
        return $er->queryOwnedBy($user);
    },
);


编辑

感谢ncatnow和unagi我更改了以前的函数以返回querybuilder

关于symfony - Symfony形式query_buider和实体存储库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17676773/

10-16 22:56