我在这里看到了很多答案,这些答案都与Doctrine 2.1中似乎严重缺乏功能有关,这可能是OOP正确性胜过关系理智的结果。
我有两个表,它们之间是多对一的关系,即“文章”和“成员”。成员(member)可以发表许多文章。拥有方的注释是
/**
* @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)
。在《教义2.1》中是否有合理的方法来做到这一点?增强功能将在查询生成器中允许
andWhere('IDENTITY(member) = ?')
吗?编辑:
多亏@Ocramius,-> where('IDENTITY(a.member)=?1')在Doctrine 2.2中有效
最佳答案
IDENTITY在由Doctrine 2.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
关于sql - 教义2.1,其中外键id = ?,编辑: Fixed in Doctrine 2. 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14968432/