web-dev-qa-db-ja.com

Symfony 2:doctrineクエリビルダーを使用した非関連テーブルの内部結合

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

私が間違っていることはありますか?

29
serious.siriso

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

$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);

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

この問題を始めたとき、それは大きな問題だったので、それを知らない他の人にとっても興味深いものになると思います。

67
serious.siriso

関連付けのないエンティティ間の結合は、バージョン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

6
Yamir
$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();
3
Jzapata

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

0
Peter Kruithof