我是laravel的新手,我遇到了DB问题。
我通过编辑/etc/mysql/my.cnf
文件禁用了'only_full_group_by'sql_mode'。我使用sql_mode
和SELECT @@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;
答案 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数据完整性异常那样抛出。