I build a form with entity type like this:
$form = $this->createFormBuilder()
->add('users', 'entity', array(
'class' => 'UserBundle:Users',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.name', 'ASC');
},)
)
->getForm();
Now I want to modify this form, to show only distinct users. I try this:
->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();
},)
)
but Symfony throws me an exception. My question is how can I use custom query in entity field type?
I don't understand what you mean with last answer. My code looks like:
repository:
public function getDistinctUsers()
{
return $this->getEntityManager()->createQuery('SELECT DISTINCT u.name FROM UserBundle:Users u ORDER BY u.name DESC')->getResult();
}
controller:
->add('users', 'entity', array(
'class' => 'UserBundle:Users',
'query_builder' => function(EntityRepository $er) {
return $er->getDistinctUsers();
},)
)
twig:
<form action="{{ path('user') }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<input type="submit" />
</form>
and it throws an exception: An exception has been thrown during the rendering of a template ("Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given") ...
The easiest way is to add a group by in the query:
$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();
I don't think you can use straight DQL here; you're using the QueryBuilder object so you have to use the QueryBuilder API to build your query.
More info here:
http://www.doctrine-project.org/docs/orm/2.0/en/reference/query-builder.html
Edit
Alternatively you could group by name?
return $er->createQueryBuilder('u')
->groupBy('u.name')
->orderBy('u.name');
Edit
Okay... If you absolutely need to use DQL there is another way. You create a custom repository for your entity, and in that define a method with your custom query. Symfony's documentation covers this process here:
http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-classes
Let's assume you create a method called findDistinctUsers
. It's then simply a case of changing the code in your form to:
return $er->findDistinctUsers();
I haven't checked this but it should work. Hope this helps :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With