如何在 Laravel 中禁用 only_full_group_by 选项

smc*_*hae 9 php mysql laravel-5 mysql-5.7

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

我通过编辑/etc/mysql/my.cnf文件禁用了 'only_full_group_by' sql_mode 。我sql_mode使用SELECT @@GLOBAL.sql_mode;and检查了 global 和 sessionSELECT @@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;
Run Code Online (Sandbox Code Playgroud)

Eme*_*bah 10

在 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'));");
Run Code Online (Sandbox Code Playgroud)


小智 9

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

'connections' => [
...

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

    ],

]
Run Code Online (Sandbox Code Playgroud)

  • 这是这个问题的正确答案并解决了我的问题。我需要按一列分组,我的 my.cnf 配置正确,但我不得不删除 laravel 的严格模式。确实,如果您的数据库按照所需的严格性正确配置,则不需要将应用程序设置为严格模式。 (2认同)
  • 这是提出的问题“如何在 Laravel 中禁用 only_full_group_by 选项”。该问题的答案由@Brian 提供。尽管您确实帮助他纠正了他的 sql,但存在不设置 full_group_by 的有效用例。否则,为什么 mysql 会允许从 my.cnf 中删除它。此设置仅在数据库 > 5.7 上启用。当然,您可以在回复中提供 OP 最佳实践,这很有帮助,但 Stackoverflow 的根本目标是让未来的读者搜索问题并找到答案。这是正确的答案。 (2认同)

Tim*_*sen 2

这是错误的处理方式。您不应该关闭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;
Run Code Online (Sandbox Code Playgroud)

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