如何在 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',''))");
我是 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',''))");