sql - 教义2.1,其中外键id = ?,编辑: Fixed in Doctrine 2. 2

标签 sql doctrine-orm

我在这里看到了很多答案,这些答案都与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/

相关文章:

sql - SQLite 真的跨平台吗?

php - 在删除级联与教义2

php - Symfony2 Doctrine 查询实体错误

mysql - 如何在数据库中存储复选框/下拉列表?

mysql - SQL like 和 concat 不返回值

php - 根据变量获取自定义表格

php - 如何验证数据映射器模式中的唯一性?

php - Symfony 应用程序中的 Doctrine 实体和业务逻辑

Symfony2 实体与列的关系

symfony - 如何访问一对一的嵌入式表单symfony2