我用这样的实体类型构建一个表单:
$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“,”array“给出”)...
答案 0 :(得分:13)
最简单的方法是在查询中添加一个组:
$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();
答案 1 :(得分:3)
我认为你不能在这里使用直接DQL;您正在使用QueryBuilder对象,因此您必须使用QueryBuilder API来构建查询。
更多信息:
http://www.doctrine-project.org/docs/orm/2.0/en/reference/query-builder.html
修改强>
或者您可以按名称分组?
return $er->createQueryBuilder('u')
->groupBy('u.name')
->orderBy('u.name');
修改强>
好的......如果你绝对需要使用DQL,还有另外一种方法。您可以为实体创建自定义存储库,并在其中使用自定义查询定义方法。 Symfony的文档在此处介绍了此过程:
http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-classes
假设您创建了一个名为findDistinctUsers
的方法。然后,只需将表单中的代码更改为:
return $er->findDistinctUsers();
我还没有检查过这个,但它应该可行。希望这会有所帮助:)
答案 2 :(得分:0)
不要在Repository方法中使用:
->getQuery()
->getResult();
一个人:
->createQueryBuilder('u')
->groupBy('u.name')
->orderBy('u.name');
喜欢'query_builder'=&gt; function(EntityRepository $ er){