10

私はおそらく非常に単純なものを見落としており、それを見つめすぎているだけですが、この DQL クエリを機能させることができません。次のような例外が発生します。

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

これが私のクエリです。ユーザーは、グループに対して多対 1 の関係にあります。これは一方向の関係であることに注意してください。あなたには意味がないかもしれませんが、ドメイン ロジックでは意味があります。

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

ここで何が欠けているか教えてもらえますか?

4

6 に答える 6

16

エラーメッセージ"Cannot select entity through..." を検索して 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

FROM を選択する必要があります。つまり、プレーン SQL のように、結合しているテーブルからのみroot entity aliasSELECT することはできません。したがって、次のような方法でそれを行う必要があります。

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 に答える