我试图弄清楚如何在学说中实现条件连接。
我有一个包含两个字段的实体A
,我们称之为b
(引用单个B
对象)和c
(引用单个{ {1}}对象)。
C
我想编写一个DQL查询,只有在/**
* @Entity
**/
class A
{
/** @ManyToOne(targetEntity="B") **/
protected $b;
/** @OneToOne(targetEntity="C") **/
protected $c;
}
不为空时才会在INNER JOIN
上执行$b
,如果$b
为空,则$b
1}}应该应用于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 (...)
但没有成功。
长话短说,这里是我想要获得的DQL类型:
LEFT JOINS
我承认我甚至不知道这种行为是否可以实现。我认为将此分成两个不同的查询会更容易,一个加入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
然后自己合并结果,但我真的很想找到一个-query解决方案(如果有的话)。
感谢阅读,以及任何最终的帮助。
因此,在$c
语句中直接处理条件时,我找不到解决方案。但是,我决定加入我需要的所有实体,并在经典的JOIN
语句中执行条件检查。
如果有人遇到同样的问题,请按照以下方式解决这个问题:
不能工作:
WHERE
作品:
SELECT a FROM model\entity\A a
LEFT JOIN a.b ab WITH ab IS NOT NULL INNER JOIN ab.d abd (...)
LEFT JOIN a.c ac WITH ac IS NOT NULL (...)
由于我无法选择自己的帖子作为答案,我想这会保持开放......? 干杯!
答案 0 :(得分:1)
您在SQL中无法描述的内容,没有条件连接的概念,因为结果集的结构必须一致。
DQL仅在ORM映射方面增强SQL,而不是在添加SQL中不存在的功能方面。在矛盾的情况下,DQL不支持SQL标准中不存在的SQL功能,或者主要SQL RDBMS供应商之间没有共同点 - 即:大多数供应商不支持或大多数供应商没有等效的。
然而,您可以构建一些PHP逻辑来帮助您;例如,您可以使用Doctrine QueryBuilder来构建基于使用预先获取的PHP级数据评估的PHP级if
条件的查询。
例如,您可以运行几个DQL查询来从a.b IS NULL
组和a.b IS NOT GROUP
(单独)预取ID,然后继续一个或多个查询以获取必要的数据关于这些ID。
答案 1 :(得分:0)
因此,我无法在 JOIN
语句中直接处理条件时找到解决方案。但是,我决定加入我需要的所有实体,并在经典的 WHERE
语句中执行条件检查。
如果有人遇到同样的问题,我是这样解决的:
不起作用:
SELECT a FROM model\entity\A a
LEFT JOIN a.b ab WITH ab IS NOT NULL INNER JOIN ab.d abd (...)
LEFT JOIN a.c ac WITH ac IS NOT NULL (...)
作品:
SELECT a FROM model\entity\A a
LEFT JOIN a.b ab
LEFT JOIN ab.d abd
LEFT JOIN a.c ac
WHERE ((ab IS NOT NULL AND (...)) OR (ac IS NOT NULL AND (...))) AND (...)
感谢@Balmipour 告诉我如何关闭此主题。