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

Symfony 实体字段类型中的自定义查询,symfony,entity,dql,Symfony,Entity,Dql,我构建了一个实体类型如下的表单: $form = $this->createFormBuilder() ->add('users', 'entity', array( 'class' => 'UserBundle:Users', 'query_builder' => function(EntityRepository $er) { return $er->createQueryBuilder('u')

我构建了一个实体类型如下的表单:

$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_widget(form)}

它抛出了一个异常:在呈现模板的过程中抛出了一个异常(“类型为“条令\ORM\QueryBuilder”、“给定数组”的预期参数”)…

我认为这里不能使用直接的DQL;您使用的是QueryBuilder对象,因此必须使用QueryBuilderAPI来构建查询

更多信息请点击此处:

编辑

或者你可以按名字分组

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

好的。。。如果您确实需要使用DQL,还有另一种方法。您可以为实体创建自定义存储库,并在其中使用自定义查询定义方法。Symfony的文档包括以下过程:

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

return $er->findDistinctUsers();

我还没有检查过,但应该可以用。希望这有帮助:)

最简单的方法是在查询中添加一个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();

不要在存储库中使用方法:

->getQuery()
->getResult();
独自一人:

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

就像在'query_builder'=>函数(EntityRepository$er){

中一样,感谢您的回复。第一个技巧非常好用,但第二个技巧会引发一个异常:在呈现模板的过程中引发了一个异常(“未定义的方法”FindDistinctors“。方法名称必须以findBy或findOneBy!开头)啊…是的。谢谢你指出这一点。我以前遇到过这种情况。我认为这是由于一些教义魔法造成的;如果你将方法更改为
getDistinctUsers()
,它应该可以正常工作。嗯,它不起作用。现在我在呈现模板时遇到了一个问题:在呈现模板的过程中引发了一个异常(“预期参数类型为“条令\ORM\QueryBuilder”、“数组”给定”)。我使用标准代码呈现模板。还有另一种方法。如果我使用选项列表而不是实体字段类型,则一切正常。我猜您正在自定义存储库方法中执行查询。我建议您只返回一个查询生成器对象,让表单执行它。谢谢-这是我遇到的问题使用。我尝试调用$er->findBy(),但您不能。我认为它应该期望结果而不是querybuilder对象更灵活。文档还应该提供更多信息,因为这很难解决。“我不理解您最后一个答案的意思。“毫无意义。请在问题答案中添加该部分作为注释。您也可以使用您正在谈论的答案的共享链接,并将其链接到您的编辑。”。
->createQueryBuilder('u')
->groupBy('u.name')
->orderBy('u.name');