首页 文章

Symfony表单query_buider和实体存储库

提问于
浏览
13

我'm trying to create a form with data in collection type depending on the user being logged. I' m跟随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中调用我的Repository函数时,我收到一个错误: Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given ,我可以理解,因为我的Repository返回一个Entity数组,而不是QueryBuilder .

我不想在表单中复制代码并创建新的QueryBuilder . 使用存储库中的查询的最佳做法是什么?我想在存储库中有两个函数,一个返回一个数组,另一个返回QueryBuilder,但是Symfony doc中的注释“或者在你的存储库中调用一个方法(甚至更好!)”让我觉得有更好的方法案件 .

2 回答

  • 24

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

    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);
        },
    );
    

    EDIT

    感谢ncatnow和unagi我已经改变了以前的函数来返回querybuilder

  • 8

    我刚刚对saamorim的答案做了一点修改 . 工作代码将是这样的:

    public function queryOwnedBy($user) {
    
        $query = $this->createQueryBuilder("u")
                ->where('u.id = :id')                
                ->setParameter('id', $user->getId());
    
        return $query;
    }
    
    public function findOwnedBy($user) {
        return $this->queryOwnedBy($user)
                ->getQuery()
                ->getResult();
    }
    

相关问题