如何在Laravel中禁用only_full_group_by选项

时间:2018-01-08 06:38:29

标签: php mysql laravel-5 mysql-5.7

我是laravel的新手,我遇到了DB问题。

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

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

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

任何建议或建议都将不胜感激。

谢谢。

使用toSql()的SQL

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;

4 个答案:

答案 0 :(得分:5)

在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'));");

答案 1 :(得分:1)

这是解决这个问题的错误方法。而不是关闭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;

我不知道为什么你关闭严格模式的尝试失败了,但在任何情况下你都不应该依赖它。

答案 2 :(得分:1)

要回答原始问题,如果要在Laravel中禁用此功能,则必须在config / database.php的数据库配置中将“ strict”值更改为 false

'connections' => [
...

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

    ],

]

答案 3 :(得分:0)

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

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

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