gpt4 book ai didi

php - Doctrine DQL 加入可空列

转载 作者:行者123 更新时间:2023-11-28 23:39:26 24 4
gpt4 key购买 nike

是否可以使用 Doctrine QueryBuilder 基于可为空的列连接两个表?

使用 Doctrine 中的默认相等运算符,转换为 MySQL 中返回 NULL 的常规相等运算符比较两个 NULL 时值(value)观。

我可以使用 null-safe operator 在纯 MySQL 中实现此目的.

SELECT t1.name, t1.field, t2.field2
FROM table1 t1
LEFT OUTER JOIN table2 t2 ON (t2.field <=> t1.field)

但是,正如我推测的那样<=>是 MySQL 特定的,在 Doctrine 中没有开箱即用的支持吗?

已尝试使用以下查询,但不幸的是,这太耗费资源,因为这适用于相当多的列。

SELECT t1.name, t1.field, t2.field2
FROM table1 t1
LEFT OUTER JOIN table2 t2 ON
(t2.field = t1.field AND t1.field IS NOT NULL)
OR (t2.field IS NULL AND t1.field IS NULL)

最佳答案

解决方案 1:Doctrine Native SQL

实现此目的的一种方法是使用 native MySQL 查询。这需要使用 Doctrine's Native SQL使用 ResultSetMapping 对查询结果进行特征和映射.

我在两次执行 native SQL 查询(使用不同参数)时遇到一个问题,即第二个查询的结果集与第一个查询的结果集相同。 Following post on GitHub为我解决了这个问题。

解决方案 2:使用 MySQL 的内部优化器

使用以下连接条件将使用 MySQL 的内部优化器并将其视为 ref_or_null连接类型

SELECT a.*, b.* 
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)

然后可以在 DQL 中使用此连接条件,它将在 SQL 中很好地转换以进行优化。

解决方案 3:编写自定义 DQL 函数

我写了一个自定义的 DQL 函数,翻译成以下子句:

SELECT a.*, b.* 
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1

不幸的是,无法删除此子句的 = 1 部分。这有效,但对我的查询造成了主要性能影响:17 秒对 0.5 秒,以提供一些(非科学)指示。
所以我没有在这条路上走得更远。

关于php - Doctrine DQL 加入可空列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34810873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com