我在这里查看了很多与 Doctrine 2.1 中似乎严重缺乏功能有关的答案,这可能是 OOP 正确性胜过关系理智的结果。
我有两个具有多对一关系的表,文章和成员。一个会员可以有许多已发表的文章。拥有方的注释是
/**
* @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
它可以工作并且可能不会慢很多,但是不需要 JOIN ,因为我已经有了 Member 对象。当我以另一种方式尝试时,我得到了所有文章,而不仅仅是活跃的文章。
我已经看到诸如Can you get a foreign key from an object in Doctine2 without loading that object?使用getEntityIdentifier
并提到了 2.2 中的改进,我可以说IDENTITY(member)
。
在 Doctrine 2.1 中是否有合理的方法来做到这一点?增强功能是否允许andWhere('IDENTITY(member) = ?')
在查询生成器中使用?
编辑:
感谢@Ocramius, ->where('IDENTITY(a.member) = ?1') 在 Doctrine 2.2 中确实有效