【发布时间】:2014-10-23 14:10:57
【问题描述】:
我正在试图弄清楚如何在学说中实现条件连接。
我有一个实体A 有两个字段,我们分别称它们为b(引用单个Bobject)和c(引用单个C 对象)。
/**
* @Entity
**/
class A
{
/** @ManyToOne(targetEntity="B") **/
protected $b;
/** @OneToOne(targetEntity="C") **/
protected $c;
}
我想编写一个 DQL 查询,该查询仅在 $b 不为空时对 $b 执行 INNER JOIN,如果 $b 为空,则应将 INNER JOIN 应用于$c而是(如果 $c 也不为空)。
我尝试将INNER JOINS 与WITH 子句结合起来检查空值,但这显然不起作用。
SELECT a FROM model\entity\A a
INNER JOIN a.b ab WITH ab IS NOT NULL INNER JOIN ab.d abd (...)
INNER JOIN a.c ac WITH ac IS NOT NULL (...)
我也尝试合并LEFT JOINS,但没有成功。
长话短说,这是我想要获得的 DQL:
SELECT a FROM model\entity\A a
IF a.b IS NOT NULL INNER JOIN a.b ab WITH (...)
IF a.b IS NULL INNER JOIN a.c ac WITH (...)
我承认我什至不知道这种行为是否可以实现。我认为将其拆分为两个不同的查询会更容易,一个加入$b,另一个加入$c,然后自己合并结果,但我真的很想找到一个单一的查询解决方案(在那里提供是任何)。
感谢您的阅读,以及任何最终的帮助。
干杯!
【问题讨论】:
-
也许你应该试着解释你为什么想要这个,你想要达到什么目的?我感觉您正在寻找错误问题的解决方案...看起来您需要一个鉴别器字段,请参阅inheritance mapping
-
在这种情况下,
$b表示另一个实体的一个实例,它具有我需要的其他实体的集合(我们称它们为D)。 $c 表示实体D的单个实例。问题是如果$b有值,我应该使用其集合中包含的D对象。或者,如果$b没有任何值(即为空),我应该直接使用$c(这也是D)。 -
@gummy 你不能选择你的问题作为anwser,但是你可以用一个常规的answer,然后选择它。
-
@Balmipour 感谢您的提示,现在关闭,迟到总比没有好!
标签: php mysql join doctrine-orm dql