#環境
- Laravel 5.7
- PHP 7.2
#事象
例えばQueryBuilderで以下のようなクエリを書くとエラーが発生。
$users = DB::table("users")
->groupBy("name")
->get();
SQLSTATE[42000]: Syntax error or access violation: 1055 'laravel_test.users.id' isn't in GROUP BY (SQL: select * from
usersgroup by
name)
海外のサイトに解決方法がありました。
Laravel 5.5 group by doesn't work - fixed
#解決方法
config/database.phpファイルで "strict"モードをfalseにします。
...
'strict' => true,
To
'strict' => false,
....
##MySQL の strict モード
Laravel5.3以上では、strict
が false
から true
にデフォルト値が変わっています。strict
が true
の場合、以下の sql_mode
がセットされます。
set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
この ONLY_FULL_GROUP_BY
を許容しないために発生している事象でした。
他にも NO_ZERO_DATE
や NO_ZERO_IN_DATE
などを使うケースでは要注意。
でも LaravelのQueryBuiderって DISTINCT
で重複除去できないので groupBy
普通に使う気がするんですが…そういう時はQueryBuider使うなって事なんですかね…。