使用 Laravel Eloquent 进行数据库操作时经常遇到的问题是 MySQL 错误“Expression #1” SELECT 列表不在 GROUP BY 子句中并且包含非聚合列[...]。”此错误是由于 MySQL 的严格模式(称为 only_full_group_by)而产生的。
为了举例说明该问题,请考虑以下 Eloquent 查询:
$products = Product::where('status', 1) ->where('stock', '>', 0) ->where('category_id', '=', $category_id) ->groupBy('store_id') ->orderBy('updated_at', 'desc') ->take(4) ->get();
执行此查询可能会导致上述 MySQL 错误。原因是 MySQL 的 only_full_group_by 模式要求 SELECT 列表中的所有列要么是聚合函数(例如 COUNT、SUM),要么包含在 GROUP BY 子句中。但是,在此查询中,id 列不包含在 GROUP BY 子句中,而是存在于 SELECT 列表中。
要解决此问题,一种有效的方法是在数据库连接设置中禁用 MySQL 的严格模式:
'connections' => [ 'mysql' => [ // Disabling strict mode for MySQL 5.6 'strict' => false, ] ]
或者,您可以将列添加到 GROUP BY子句:
$products = Product::where('status', 1) ->where('stock', '>', 0) ->where('category_id', '=', $category_id) ->groupBy('store_id', 'id') ->orderBy('updated_at', 'desc') ->take(4) ->get();
通过放宽严格模式或调整查询以满足MySQL的要求,您可以消除此错误并成功检索数据。
以上是如何解决 Laravel Eloquent 中 MySQL 的'与 sql_mode=only_full_group_by 不兼容”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!