2017-06-29 31 views
1

この質問から:How to GROUP and SUM a pivot table column in Eloquent relationship?Laravel - 雄弁関係belongsToMany GROUPBY「構文エラーまたはアクセス違反」エラー

私は私のUserモデルでこのコードを使用:

public function teams() { 
    return $this->belongsToMany('App\Models\Team', 'team_members', 'user_id', 'team_id') 
     ->groupBy('pivot_team_id'); 
} 

ため、私は私の中で->groupBy()を使用していましたteamである場合、単一のuserは、異なる役割に対して複数の役割を果たすことができます。私はteamレコードが重複しないようにしたい。

しかし、私がアクセスしようとすると、私のページdd(Auth::user()->teams)でこのコードで、Laravelは、次の例外がスローされました:

SQLSTATE[42000]: Syntax error or access violation: 1055 'laravel.teams.id' isn't in GROUP BY (SQL: select `teams`.*, `team_members`.`user_id` as `pivot_user_id`, `team_members`.`team_id` as `pivot_team_id` from `teams` inner join `team_members` on `teams`.`id` = `team_members`.`team_id` where `team_members`.`user_id` = 3 group by `pivot_team_id`)

は、その後、私は自分でエラーのそれとまったく同じSQLを実行してみました、それが働いた: Working example

なぜそうですか?そして、どこが間違っていたのですか?

+0

これが役立つかどうかを確認する - https://github.com/barryvdh/laravel-translation-manager/issues/144 – ayip

+0

@ayipこれはうまくいきますが、ハックのようです。完全なグループを無効にすることなくそれを行う方法がなければなりません –

答えて

1

@ayipの助けを借りて、strictモードがconfig/database.phpで問題が発生していました。

これまでのところ唯一の2のソリューションがあります。

  1. 無効にstrictモードでは、

    return $this->belongsToMany('App\Models\Team', 'team_members', 'user_id', 'team_id') 
         ->selectRaw('sum(team_members.team_member_role_id) as pivot_count') //because this is different across records beside others in group by 
         ->groupBy('teams.id', 'teams.name', 'teams.description', 'team_members.user_id', 'team_members.team_id'); 
    

    あなたが選ぶことができることに注意してください:または

  2. これは2の例であるgroupByやなどSUM()

などの集計関数でbelongsToManyテーブルで選択されたすべての列を含めますSUM()異なるレコードではあるが、残りの列でグループ化することができ、その特定の列は気にしません。たとえば、次のように

job   | gender 
programmer | M 
programmer | F 
accountant | M 

あなたはGROUP BY後にその列を追加する必要はありませんので、あなたは、SUM()genderそして、異なる性別のジョブを区別したくない場合。

関連する問題