I'm probably overlooking something very simple and just been staring at it too much, but I can't get this DQL query to work. I get an exception stating:
Cannot select entity through identification variables without choosing at least one root entity alias.
Here's my query. User has a many-to-one relation to Group. Note that this is a unidirectional relation! That may make no sense to you, but it makes sense in our domain logic.
SELECT DISTINCT g
FROM Entity\User u
LEFT JOIN u.group g
WHERE u.active = :active
Can you tell me what I am missing here?
Since this is the first Google match when searching for the error message "Cannot select entity through...", I decided to respond despite the topic was posted few months ago.
The trick is to use JOIN ... WITH ... (like JOIN ... ON ... in SQL).
I was having the message with this code:
SELECT ro, COUNT(ro)
FROM FH\MailerBundle\Entity\Recipient r
JOIN r.selectedOption ro
GROUP BY ro.id
I solved the problem by this code:
SELECT ro, COUNT(ro)
FROM FH\MailerBundle\Entity\RecipientOption AS ro
JOIN FH\MailerBundle\Entity\Recipient AS r WITH r.selectedOption = ro
GROUP BY ro.id
I needed to specify full namespaces and classes for both entities.
You need to select FROM the root entity alias
.. meaning you can't SELECT only from a table you're joining on, as you can in plain sql.. so something like this should do it:
SELECT DISTINCT g
FROM Entity\Group g
INNER JOIN g.user u
WHERE u.active = :active
I worked around the problem by doing a subselect:
SELECT g
FROM Entity\Group
WHERE g.id IN (
SELECT DISTINCT g2.id
FROM Entity\User u
LEFT JOIN u.group g2
WHERE u.active = :active
)
You can do this using DQL's new WITH keyword:
SELECT DISTINCT g
FROM Entity\User u
LEFT JOIN Entity\Group g
WITH u in g.users
WHERE u.active = :active
I had a similar problem and solved it by multiple from lines like this:
$this->getDoctrine()->createQueryBuilder()
->from('ProjectMainBundle:Group', 'g')
->from('ProjectMainBundle:User', 'u')
->select('distinct(g)')
->where('u.group = g')
->andWhere('u.active = :active')
->....
Hennes
I use this
$qb = $this->createQueryBuilder('o')
->select('DISTINCT IDENTITY(o.user)')