首页 文章

实体字段类型中的自定义查询

提问于
浏览
9

我用这样的实体类型构建一个表单:

$form = $this->createFormBuilder()
->add('users', 'entity', array(
    'class' => 'UserBundle:Users',
        'query_builder' => function(EntityRepository $er) {
            return $er->createQueryBuilder('u')
                          ->orderBy('u.name', 'ASC');
                        },)
      )
->getForm();

现在我想修改此表单,仅显示不同的用户 . 我试试这个:

->add('users', 'entity', array(
                        'class' => 'UserBundle:Users',
                        'query_builder' => function(EntityRepository $er) {
                        return $er->createQuery('SELECT DISTINCT u.name FROM UserBundle:Users ORDER BY u.name ASC')->getResult();
                        },)
                      )

但是Symfony给了我一个例外 . 我的问题是如何在实体字段类型中使用自定义查询?


我不明白你的意思是什么意思 . 我的代码看起来像:

库:

public function getDistinctUsers()
{
    return $this->getEntityManager()->createQuery('SELECT DISTINCT u.name FROM UserBundle:Users u ORDER BY u.name DESC')->getResult();
}

控制器:

->add('users', 'entity', array(
    'class' => 'UserBundle:Users',
    'query_builder' => function(EntityRepository $er) {
            return $er->getDistinctUsers();
         },)
      )

枝条:

<form action="{{ path('user') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <input type="submit" />
</form>

并且它抛出一个异常:在渲染模板期间抛出了一个异常(“预期参数类型为”Doctrine \ ORM \ QueryBuilder“,”数组“给出了”)...

3 回答

  • 3

    最简单的方法是在查询中添加group by:

    $form = $this->createFormBuilder()
      ->add('users', 'entity', array(
        'class' => 'UserBundle:Users',
        'query_builder' => function(EntityRepository $er) {
          return $er->createQueryBuilder('u')
                    ->groupBy('u.id')
                    ->orderBy('u.name', 'ASC');
          },)
        )
    ->getForm();
    
  • 13

    我不认为你可以在这里使用直接DQL;您正在使用QueryBuilder对象,因此您必须使用QueryBuilder API来构建查询 .

    更多信息:

    http://www.doctrine-project.org/docs/orm/2.0/en/reference/query-builder.html

    Edit

    或者你可以按名称分组?

    return $er->createQueryBuilder('u')
        ->groupBy('u.name')
        ->orderBy('u.name');
    

    Edit

    好的......如果你绝对需要使用DQL,还有另外一种方法 . 您可以为实体创建自定义存储库,并在其中使用自定义查询定义方法 . Symfony的文档涵盖了此过程:

    http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-classes

    我们假设您创建了一个名为 findDistinctUsers 的方法 . 然后,只需将表单中的代码更改为:

    return $er->findDistinctUsers();
    

    我没有检查过这个,但它应该工作 . 希望这可以帮助 :)

  • 0

    不要在Repository方法中使用:

    ->getQuery()
    ->getResult();
    

    只是一个人:

    ->createQueryBuilder('u')
    ->groupBy('u.name')
    ->orderBy('u.name');
    

    比如'query_builder'=> function(EntityRepository $ er){

相关问题