学说有条件的加入

时间:2014-10-23 14:10:57

标签: php mysql join doctrine-orm dql

我试图弄清楚如何在学说中实现条件连接。

我有一个包含两个字段的实体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也不为空)。

我尝试将$cINNER 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 (...)

由于我无法选择自己的帖子作为答案,我想这会保持开放......? 干杯!

2 个答案:

答案 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 告诉我如何关闭此主题。