LaravelのgroupByメソッドで発生しがちなエラーの原因と修正方法を教えますね。
Gruop Byのエラー。SQLSTATE[42000]: Syntax error or access violation: 1055 ‘users.id’ isn’t in GROUP BY (SQL: select * from `users` group by `company_id`)
MySqlのモードがstrictモードだとgroupByで指定したカラムのみをselectするカラムとして指定する必要があるエラーですね。
つまりgroupByで指定したカラムをselectメソッドでも指定を強制している感じです。
SQLSTATE[42000]: Syntax error or access violation: 1055 'users.id' isn't in GROUP BY (SQL: select * from `users` group by `company_id`)
DB::table('users')
->groupBy('company_id')
->get()
発想としては単純にstrictモードを外せばいい、という感じですね。
laravelのアプリケーション側からの設定で外せるんですね。てっきりMySqlのmy.cnfみたいなデータベース側の設定ファイルによってコントロールされるものだと思っていました。
能書きはいいとして具体的な設定は以下。
まずconfig/database.phpのファイルを開きます。
mysqlの配列でstrict => falseとし、MySQLのストリクトモードを無効にするといい。
#config/database.php
'connections' => [
'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' => '',
'prefix_indexes' => true,
'strict' => false, // here!
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
],
select句のカラムをいちいち気にするよりもデータベース側の設定で許容するほうがはるかにラクですね
(追記)
こちらの記事のほうがよりより方法かも
https://qiita.com/baseball341yakiniku/items/c8a86c6de2101a14880a
[参考]https://stackoverflow.com/questions/42104412/what-is-the-use-of-strict-in-laravel-config-database
https://stackoverflow.com/questions/40917189/laravel-syntax-error-or-access-violation-1055-error
Laravelの公式はこちら
https://laravel.com/docs/9.x/queries#groupby-having