Laravel Eloquent 查询生成器中的奇怪错误

Strange error in Laravel Eloquent query builder

我知道这是一个已知问题,SO 上还有其他关于此问题的问题,但其中 none 个问题很有用。如果我在 运行 抛出 Laravel 时直接对数据库 运行 给出错误,则原始查询工作正常。 这到底是怎么回事?

查询:

Order::selectRaw("COUNT(id) AS `data`, DATE_FORMAT(created_at, '%m-%Y') AS new_date, YEAR(created_at) AS `year`, MONTH(created_at) AS `month`")
        ->groupBy('year')->get();

错误:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'orders.created_at' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select COUNT(id) AS `data`, DATE_FORMAT(created_at, '%m-%Y') AS new_date, YEAR(created_at) AS `year`, MONTH(created_at) AS `month` from `orders` group by `year`)

这是数据库错误,与 Laravel 无关。 运行 数据库中完全相同的查询也应该失败,如果没有失败,那么它应该:)。

您还需要按查询中的其他字段进行分组,"new_date"、"month" 和 "year"。尝试这样的事情:

Order::selectRaw("COUNT(id) AS `data`, DATE_FORMAT(created_at, '%m-%Y') AS new_date, YEAR(created_at) AS `year`, MONTH(created_at) AS `month`")
    ->groupBy('year', 'month', 'new_date')->get();

如果您在数据库中 运行 没有任何问题,那么它是您文件 config->database.php[= 中的 laravel 设置16=], 只需将 'strict' 设置为 'false'.

'mysql' => [
    'driver' => 'mysql',
    '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' => 'utf8',
    'collation' => 'utf8_general_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],