如何在 Laravel 中禁用 only_full_group_by 选项

How to disable only_full_group_by option in Laravel

我是 laravel 的新手,我遇到了数据库问题。

我通过编辑 /etc/mysql/my.cnf 文件禁用了 'only_full_group_by' sql_mode。我使用 SELECT @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode; 检查了全局和会话的 sql_mode 并确认 sql_mode 不再有 only_full_group_by.

但是,当我通过邮递员发出请求时,它给我的错误是 this is incompatible with sql_mode=only_full_group_by

我很困惑。为什么我更改 sql_mode 后仍会出现此错误?我做错了什么吗?

如有任何建议或建议,我们将不胜感激。

谢谢。

SQL 使用 toSql()

select A.* 
from `A` 
inner join `B` on `A`.`id` = `B`.`a_id` 
inner join `C` on `C`.`id` = `B`.`c_id` 
group by `A`.`id` having COUNT(A.id) > 0;

这是错误的处理方式。与其关闭 only_full_group_by 模式,不如修复查询,使其不会中断 MySQL:

SELECT a1.*
FROM A a1
INNER JOIN
(
    SELECT A.id
    FROM A
    INNER JOIN B
        ON A.id = B.a_id 
    INNER JOIN C
        ON C.id = B.c_id
    GROUP BY A.id
    HAVING COUNT(A.id) > 0
) a2
    ON a1.id = a2.id;

我不知道为什么您关闭严格模式的尝试失败了,但无论如何您都不应该依赖它。

要回答最初的问题,如果您想在 Laravel 中禁用它,您必须在数据库配置中将 'strict' 值更改为 false在 config/database.php.

'connections' => [
...

    'mysql' => [
    ...
        'strict' => false,
        ...

    ],

]

将此模式添加到 config/database。php

'mysql' => [
 ...
        'modes' => [
            'STRICT_ALL_TABLES',
        ],
],

如果你设置 'strict' => true。某些 sql 异常不会像 sql 数据完整性异常那样抛出。

在 Laravel 中,您可以在运行时执行此操作而不是进行全局设置

//disable ONLY_FULL_GROUP_BY
DB::statement("SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));");

//Your SQL goes here - The one throwing the error (:

//re-enable ONLY_FULL_GROUP_BY
DB::statement("SET sql_mode=(SELECT CONCAT(@@sql_mode, ',ONLY_FULL_GROUP_BY'));");

您可以在当前 mysql 会话中禁用它

DB::statement("SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))");