所以我现在已经绞尽脑汁待了一会儿.在Doctrine中,没有正确连接的概念.我知道你可以像右连接一样使用左连接,但我无法弄清楚我的例子,这就是为什么我在这里.
我的例子:
我在Doctrine中有一个实体,它与自己有一对一的关系,称为“父”.
我试图让所有实体及其子(如果存在)没有重复.
通过正确的连接,这很简单,因为我可以说:
SELECT parent.*,child.* FROM table child RIGHT JOIN table parent ON parent.id = child.parent_id WHERE parent.parent_id is null;
但是使用左连接我返回结果,我无法弄清楚where子句应该过滤掉它们.
所以我的问题是“教条是否有办法正确加入”或“如何使用左连接操作,如右连接”?
– -编辑 – –
你们对改变我选择的表的排序有什么看法是正确的,但是我使用的是Doctrine,所以关系确实是child-> parent.这是我的学说查询:
我的实体:
/** * @Entity * @Table(name="entity") */ class Entity { ... /** * @OneToOne( * targetEntity="Entity",* fetch="EAGER" * ) * @JoinColumn(name="parent_id",referencedColumnName="id") */ private $parent; ... }
我的学说选择声明:
$em->createQueryBuilder() ->select(array('child','parent')) ->from('Entity','child') ->leftjoin('child.parent','parent') ->orderBy('parent.id','asc') ->getQuery() ->execute();
我不知道如何以及如何切换表的排序.我也尝试过创建另一个从实体到自身的关系(就像我做父母一样)但是把它叫做孩子.但是,当我使用新架构doctrine更新db时抛出错误.
有任何想法吗?并感谢您的快速反应!
—编辑2 —
左连接sql和结果:
SELECT child.id,child.changed_timestamp,child.parent_entity_id,parent.id,parent.changed_timestamp,parent.parent_entity_id FROM content child LEFT JOIN content parent ON child.parent_entity_id = parent.id ORDER BY parent.id ASC child_id child_timestamp parent_entity_id parent_id parent_timestamp parent_entity_id 1 8/16/12 20:29 NULL NULL NULL NULL 7 9/20/12 16:07 NULL NULL NULL NULL 8 8/17/12 16:08 NULL NULL NULL NULL 9 8/17/12 20:44 NULL NULL NULL NULL 10 8/17/12 21:03 NULL NULL NULL NULL 11 8/17/12 21:17 NULL NULL NULL NULL 194 9/19/12 9:58 NULL NULL NULL NULL 195 9/20/12 10:38 NULL NULL NULL NULL 196 9/19/12 11:58 NULL NULL NULL NULL 197 NULL 196 196 9/19/12 11:58 NULL 200 9/20/12 16:02 1 1 8/16/12 20:29 NULL 202 9/20/12 16:35 NULL NULL NULL NULL 204 9/21/12 8:41 NULL NULL NULL NULL 206 NULL 204 204 9/21/12 8:41 NULL
正确的加入结果:
SELECT child.id,parent.parent_entity_id FROM content child RIGHT JOIN content parent ON child.parent_entity_id = parent.id WHERE parent.parent_entity_id is null ORDER BY parent.id ASC child_id child_timestamp parent_entity_id parent_id parent_timestamp parent_entity_id 200 9/20/12 16:02 1 1 8/16/12 20:29 NULL NULL NULL NULL 7 9/20/12 16:07 NULL NULL NULL NULL 8 8/17/12 16:08 NULL NULL NULL NULL 9 8/17/12 20:44 NULL NULL NULL NULL 10 8/17/12 21:03 NULL NULL NULL NULL 11 8/17/12 21:17 NULL NULL NULL NULL 194 9/19/12 9:58 NULL NULL NULL NULL 195 9/20/12 10:38 NULL 197 NULL 196 196 9/19/12 11:58 NULL NULL NULL NULL 202 9/20/12 16:35 NULL 206 NULL 204 204 9/21/12 8:41 NULL
我想用正确的join sql来实现结果.具有关联子级的唯一父实体(如果存在)但我需要使用doctrine来实现它.再次感谢!
@H_301_42@解决方法
@ 491243的评论是正确的:如果您使用的是s,这将是一个微不足道的问题,因为左右连接很容易转换,关系谓词可以按任何顺序表示.
真正的问题似乎不是如何将右连接重写为左连接,而是如何在另一个方向上遍历您的关系.想必你不能做这样的事情吗?:
$em->createQueryBuilder() ->select(array('child','parent') ->leftjoin('parent.child','child') ->orderBy('parent.id','asc') ->getQuery() ->execute();@H_301_42@ @H_301_42@ 原文链接:https://www.f2er.com/mssql/76803.html