10

我可能忽略了一些非常简单的东西,只是盯着它看太多了,但我无法让这个 DQL 查询工作。我得到一个例外说明:

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

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

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

你能告诉我我在这里想念什么吗?

4

6 回答 6

16

由于这是搜索错误消息“无法通过...选择实体”时的第一次 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

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

于 2012-12-30T15:24:04.193 回答
7

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

SELECT DISTINCT g
FROM Entity\Group g
INNER JOIN g.user u
WHERE u.active = :active
于 2012-04-18T13:22:31.967 回答
6

我通过子选择解决了这个问题:

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
)
于 2012-04-19T05:49:00.003 回答
3

我遇到了类似的问题,并通过多次from调用解决了它,如下所示:

$this->getDoctrine()->createQueryBuilder()
    ->from('ProjectMainBundle:Group', 'g')
    ->from('ProjectMainBundle:User', 'u')
    ->select('distinct(g)')
    ->where('u.group = g')
    ->andWhere('u.active = :active')
    ->....
于 2014-05-16T14:30:01.363 回答
2

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

SELECT DISTINCT g
FROM Entity\User u
LEFT JOIN Entity\Group g
WITH u in g.users
WHERE u.active = :active
于 2013-01-23T10:08:15.280 回答
2

我用这个

$qb = $this->createQueryBuilder('o')
           ->select('DISTINCT IDENTITY(o.user)')
于 2017-08-31T15:34:34.890 回答