2017-06-29 10 views
1

Aus dieser Frage: How to GROUP and SUM a pivot table column in Eloquent relationship?Laravel - Eloquent Beziehung belongsToMany groupBy "Syntaxfehler oder Zugriffsverletzung" Fehler

ich diesen Code verwenden in meinem User Modell:

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

wollte ich ->groupBy() verwenden, weil in meinem team s, ein einzelnes user kann als mehrere team_member s für verschiedene Rollen fungieren. Ich möchte nicht team Datensätze duplizieren.

Aber wenn ich versuche, z. mit diesem Code auf meiner Seite dd(Auth::user()->teams), Laravel die folgende Ausnahme ausgelöst hat:

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`)

Dann versuchte ich von mir, dass genau die gleiche SQL in dem Fehler ausgeführt wird, es funktionierte: Working example

Warum ist das so? Und wo habe ich es falsch verstanden?

+0

Sehen Sie, ob dies hilft - https://github.com/barryvdh/laravel-translation-manager/issues/144 – ayip

+0

@ayip Es funktioniert jetzt, aber es scheint wie ein Hack. Es muss einen Weg geben, dies zu tun, ohne die ganze Gruppe zu deaktivieren –

Antwort

1

Mit Hilfe von @ayip, war das Problem mit dem strict Modus in config/database.php.

Es gibt nur 2 Lösungen so weit:

  1. Disable Strict-Modus; oder
  2. Fügen Sie alle ausgewählten Spalten in den Tabellen belongsToMany in groupBy oder in Aggregatfunktionen wie SUM() usw.

Dies ist ein Beispiel in 2:

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'); 

Bitte beachten Sie, dass Sie können wählen, SUM() Spalten in Datensätzen, die unterschiedlich sind, aber durch den Rest der Spalten gruppiert werden können und Sie sich nicht um diese spezifische Spalte kümmern. Zum Beispiel:

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

Wenn Sie nicht wollen, zwischen Jobs mit unterschiedlichen Geschlechtern unterscheiden, dann SUM() die gender, so müssen Sie sich nicht, dass die Spalte nach GROUP BY hinzufügen.

Verwandte Themen