12
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel5 QueryBuilderでgroupByが動かない時の対応方法

Last updated at Posted at 2019-01-17

#環境

  • 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 byname)

海外のサイトに解決方法がありました。
Laravel 5.5 group by doesn't work - fixed

#解決方法
config/database.phpファイルで "strict"モードをfalseにします。

config/database.php
...
'strict' => true,
To
'strict' => false,
....

##MySQL の strict モード
Laravel5.3以上では、strictfalse から true にデフォルト値が変わっています。stricttrue の場合、以下の 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_DATENO_ZERO_IN_DATE などを使うケースでは要注意。

でも LaravelのQueryBuiderって DISTINCT で重複除去できないので groupBy 普通に使う気がするんですが…そういう時はQueryBuider使うなって事なんですかね…。

12
17
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?