我在这里看到了很多答案,这些答案与Doctrine 2.1中严重缺乏功能有关,这可能是OOP正确性胜过关系理智的结果.
我有两个表与多对一的关系,文章和成员.会员可以发表许多文章.拥有方的注释是
/**
* @var \Member
* @ORM\ManyToOne(targetEntity="Member")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="member_id", referencedColumnName="id")
* })
*/
private $member;
Run Code Online (Sandbox Code Playgroud)
我想获得成员6的所有活动文章,这是一个简单的SQL查询:
SELECT * FROM mbr_article
WHERE active = 1 AND member_id = 6
ORDER BY article_id DESC
Run Code Online (Sandbox Code Playgroud)
我最终得到的是
$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();
Run Code Online (Sandbox Code Playgroud)
哪个产生了
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
Run Code Online (Sandbox Code Playgroud)
哪个工作,可能不会慢很多,但不需要JOIN,因为我已经有了Member对象.当我以另一种方式尝试时,我得到的所有文章不仅仅是活跃的文章.
我已经看过诸如你可以从Doctine2中的对象获取外键而不加载该对象的响应吗?getEntityIdentifier在我可以说的2.2中使用和提及改进IDENTITY(member).
在Doctrine 2.1中有没有合理的方法呢?增强是否允许andWhere('IDENTITY(member) = ?')在查询构建器中使用?
编辑:
感谢@Ocramius, - > where('IDENTITY(a.member)=?1')在Doctrine 2.2中工作
Pet*_*ter 21
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();
Run Code Online (Sandbox Code Playgroud)
生成以下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
Run Code Online (Sandbox Code Playgroud)