私はここで、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で機能します