45

次のような関連のないテーブルを結合するDoctrineクエリビルダーを使用してクエリを作成しようとしています。

$query = $this->createQueryBuilder('gpr')
        ->select('gpr, p')
        ->innerJoin('TPost', 'p')
        ->where('gpr.contentId = p.contentId')

しかし、これは機能しません。それでもエラーが発生します:

エラー:識別変数TPostが結合パス式で使用されましたが、以前は定義されていませんでした。

私はこのエラーメッセージを検索し、誰もがp.someAttributeのようなテーブルエイリアス+属性を使用するように答えました。しかし、私が参加したいテーブルは、私が選択を開始したテーブルとは関係がありません。

通常のmysqlクエリとして、次のように記述します。

SELECT * FROM t_group_publication_rel gpr 
INNER JOIN t_post p 
WHERE gpr.content_id = p.content_id

私が間違っていることについて何か考えはありますか?

4

4 に答える 4

94

今日、私は同様のタスクに取り組んでいて、この問題を開いたことを思い出しました。どのドクトリンバージョンが機能しているかはわかりませんが、現在、継承マッピングで子クラスに簡単に参加できます。したがって、このようなクエリは問題なく機能しています。

$query = $this->createQueryBuilder('c')
        ->select('c')
        ->leftJoin('MyBundleName:ChildOne', 'co', 'WITH', 'co.id = c.id')
        ->leftJoin('MyBundleName:ChildTwo', 'ct', 'WITH', 'ct.id = c.id')
        ->orderBy('c.createdAt', 'DESC')
        ->where('co.group = :group OR ct.group = :group')
        ->setParameter('group', $group)
        ->setMaxResults(20);

継承マッピングを使用している親クラスでクエリを開始します。私の以前の投稿では、それは別の出発点でしたが、私が正しく覚えていれば同じ問題です。

この号を始めたときは大きな問題だったので、知らない人にも面白いと思います。

于 2013-05-28T11:06:20.827 に答える
12

関連付けのないエンティティ間の結合は、バージョン2.4までは不可能でした。バージョン2.4では、次の構文で任意の結合を生成できます。

$query = $em->createQuery('SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email');

参照:http ://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

于 2016-09-04T23:09:21.857 に答える
3
$dql = "SELECT 
    a, md.fisrtName , md.LastName, mj
    FROM MembersBundle:Memberdata md
        INNER JOIN MembersBundle:Address a WITH md = a.empID
        INNER JOIN MembersBundle:Memberjob mj WITH md = mj.memberData
            ...
    WHERE
        a.dateOfChange IS NULL
    AND WHERE
        md.someField = 'SomeValue'";

return $em->createQuery( $dql )->getResult();
于 2013-10-20T14:56:32.757 に答える
1

DQL結合は、マッピングで関連付けが定義されている場合にのみ機能します。あなたの場合、ネイティブクエリを実行し、ResultSetMappingを使用してオブジェクトにデータを入力する方がはるかに簡単だと思います。

于 2012-06-27T19:41:12.427 に答える