8

私はここで、Doctrine 2.1の機能の深刻な欠如と思われるものに関連する多くの回答を見てきました。これは、OOPの正しさが関係の健全性を打ち負かした結果である可能性があります。

ArticlesとMembersという多対1の関係を持つ2つのテーブルがあります。メンバーは多くの公開された記事を持つことができます。所有側の注釈は

/**
 * @var \Member
 * @ORM\ManyToOne(targetEntity="Member")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="member_id", referencedColumnName="id")
 * })
 */
 private $member;

メンバー6のすべてのアクティブな記事を取得したいのですが、これはSQLの単純なクエリです。

SELECT * FROM mbr_article 
   WHERE active = 1 AND member_id = 6 
   ORDER BY article_id DESC

私が最終的に得たのは

$rep = $this->getDoctrine()->getRepository('SMWMemberBundle:Article');
$q = $rep->createQueryBuilder('a')
     ->leftJoin('a.member','m')    
     ->where('m.id = ?1')
     ->andWhere('a.active = 1')
     ->orderBy('a.id', 'DESC')
     ->setParameter(1, $id)    
     ->getQuery();

生成された

SELECT m0_.id AS id0, m0_.active AS active1, m0_.update_time AS update_time2,
       m0_.content AS content3, m0_.member_id AS member_id4 
   FROM mbr_article m0_ 
   LEFT JOIN mbr_member m1_ ON m0_.member_id = m1_.id 
   WHERE m1_.id = ? AND m0_.active = 1 
   ORDER BY m0_.id DESC

これは機能し、おそらくそれほど遅くはありませんが、私はすでにMemberオブジェクトを持っているので、そのJOINは必要ありません。逆に試してみると、アクティブな記事だけでなく、すべての記事が表示されました。

Doctine2のオブジェクトをロードせずにそのオブジェクトから外部キーを取得できますか?などの応答を見ました。その使用getEntityIdentifierと私が言うことができる2.2で来る改善に言及しますIDENTITY(member)

Doctrine 2.1でこれを行うための合理的な方法はありますか?andWhere('IDENTITY(member) = ?')拡張機能はクエリビルダーで 許可されますか?

編集:

@Ocramiusのおかげで、-> where('IDENTITY(a.member)=?1')はDoctrine2.2で機能します

4

1 に答える 1

22

IDENTITYは、Doctrine2.2のクエリビルダーによって生成されたWHERE句で機能します。

$q = $rep->createQueryBuilder('a')
    ->where('IDENTITY(a.member) = ?1')
    ->andWhere('a.active = 1')
    ->orderBy('a.id', 'DESC')
    ->setParameter(1, $id)    
    ->getQuery();

次のSQLを生成します。

SELECT m0_.id AS id0, m0_.active AS active1, m0_.update_time AS update_time2, 
       m0_.content AS content3, m0_.member_id AS member_id4 
    FROM mbr_article m0_ 
    WHERE m0_.member_id = ? AND m0_.active = 1 
    ORDER BY m0_.id DESC
于 2013-02-19T23:19:46.933 に答える