laravel8数据库操作之group by踩坑

laravel8数据库操作之group by踩坑

$product = \DB::table(“product”)->selectRaw(“name,create_time”)
->groupBy(“create_time”)
->get();

报错:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘db.t_product.name’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select name,create_time from t_product group by create_time)

解决:
/config/database.php 文件里的strict参数修改为false即可

‘mysql’ => [
‘driver’ => ‘mysql’,
‘url’ => env(‘DATABASE_URL’),
‘host’ => env(‘DB_HOST’, ‘127.0.0.1’),
‘port’ => env(‘DB_PORT’, ‘3306’),
‘database’ => env(‘DB_DATABASE’, ‘forge’),
‘username’ => env(‘DB_USERNAME’, ‘forge’),
‘password’ => env(‘DB_PASSWORD’, ‘’),
‘unix_socket’ => env(‘DB_SOCKET’, ‘’),
‘charset’ => ‘utf8mb4’,
‘collation’ => ‘utf8mb4_unicode_ci’,
‘prefix’ => ‘t_’,
‘prefix_indexes’ => true,
‘strict’ => true,//这里修改为false
‘engine’ => null,
‘options’ => extension_loaded(‘pdo_mysql’) ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env(‘MYSQL_ATTR_SSL_CA’),
]) : [],
]

我用的mysql8,网上搜了一下说是mysql8的问题,然后修改了sql_mode的内容。但是laravel项目运行这段代码依然报错,于是我就装了一个mysql5.7,发现问题依然存在。
于是百度 laravel group报错 问题解决
结帖

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 7

确实是mysql版本的问题,strict只是修改为非严格模式,但不建议这么做!

3年前 评论

@Imuyu 但现在有这么一个情况,就是mysql那边我用group查询,是没有问题。但是放到laravel这边查询,就报错。修改了strict就不报错了。

这个问题有办法解决吗

3年前 评论
8565012 3年前
baitiao (作者) (楼主) 3年前
Epona

group by 之后其他的字段 要么是 sum,min 等能进行计算类的,要么是需要自己处理的。 不建议单纯改成false。因为本质上你这个SQL是不对的。

3年前 评论
baitiao (楼主) 3年前
FishTail 3年前

sql语句的问题

3年前 评论

扒过源码,laravel 框架在连接数据库的时候专门设置了 sql_mode 所以改mysql 的 sql_mode 是无效的,他只会影响没有设置 sql mode 的连接,所以通过 navicat 等的连接是正常的

strict = true 的时候,是强制加的有 only_full_group_by 所以改为 false 正常,还可以使用另一种配置

strict = true 然后在增加一个配置 modes,里面只把 only_full_group_by 删除

'strict' => true,
'modes' => ['ONLY_FULL_GROUP_BY','STRICT_TRANS_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO','NO_ENGINE_SUBSTITUTION'],

查看详细的说明

3年前 评论
baitiao (楼主) 3年前

我在 tp 里面也遇到过这样的问题, 我怀疑是我 SQL 的问题, 但是我又没有找到合适的办法, 于是就修改了配置文件的 sql_mode, 然后解决了

3年前 评论
yzh52521 3年前
qingshui (作者) 3年前

ONLY_FULL_GROUP_BY 更加符合 SQL 标准,所以不建议关掉 可以使用 ANY_VALUE() 通过 ANY_VALUE() 来改造查询语句以避免报错

3年前 评论
baitiao (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!