Doctrine查询不同的相关实体

时间:2012-04-18 07:17:01

标签: php doctrine-orm dql

我可能忽略了一些非常简单的事情,只是盯着它看太多,但我无法让这个DQL查询起作用。我得到一个例外陈述:

Cannot select entity through identification variables without choosing at least one root entity alias.

这是我的查询。用户与Group具有多对一关系。请注意,这是单向关系!这可能对你没有意义,但它在我们的域逻辑中是有意义的。

SELECT DISTINCT g
FROM Entity\User u
LEFT JOIN u.group g
WHERE u.active = :active

你能告诉我这里缺少什么吗?

6 个答案:

答案 0 :(得分:15)

由于这是搜索错误消息“无法通过...选择实体”时的第一个Google匹配,因此我决定回复,尽管该主题是在几个月前发布的。

诀窍是使用JOIN ... WITH ...(如SQL中的JOIN ... ON ...)。

我收到了这段代码的消息:

SELECT ro, COUNT(ro)
FROM FH\MailerBundle\Entity\Recipient r
JOIN r.selectedOption ro
GROUP BY ro.id

我用这段代码解决了这个问题:

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

我需要为两个实体指定完整的命名空间和类。

答案 1 :(得分:6)

你需要选择FROM root entity alias ..这意味着你不能从你正在加入的表中选择 ,就像在普通的sql中一样..所以像这应该这样做:

SELECT DISTINCT g
FROM Entity\Group g
INNER JOIN g.user u
WHERE u.active = :active

答案 2 :(得分:5)

我通过做一个子选择来解决这个问题:

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
)

答案 3 :(得分:2)

您可以使用DQL的新 WITH 关键字来执行此操作:

SELECT DISTINCT g
FROM Entity\User u
LEFT JOIN Entity\Group g
WITH u in g.users
WHERE u.active = :active

答案 4 :(得分:1)

我遇到了类似的问题,并通过以下几行解决了这个问题:

$this->getDoctrine()->createQueryBuilder()
    ->from('ProjectMainBundle:Group', 'g')
    ->from('ProjectMainBundle:User', 'u')
    ->select('distinct(g)')
    ->where('u.group = g')
    ->andWhere('u.active = :active')
    ->....

亨尼斯

答案 5 :(得分:0)

我用这个

$qb = $this->createQueryBuilder('o')
           ->select('DISTINCT IDENTITY(o.user)')