【laravel】groupByでエラー。SQLSTATE[42000]:Syntax error or access violation: isn’t in GROUP BY

laravelのgroupBy

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