2017-06-29 182 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 s,單個user可以充當不同角色的多個team_member。我不想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的幫助下,問題出在config/database.phpstrict模式。

只有2解決方案迄今:

  1. 禁用嚴格模式;或
  2. 包括在belongsToMany表中選擇的所有列在groupBy或聚合函數,如SUM()

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

請注意,您可以選擇SUM()記錄中的列是不同的,但可以按其餘列進行分組,並且您不關心該特定列。例如:

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

如果你不想與不同性別的工作加以區分,然後SUM()gender,所以你不必GROUP BY後添加該列。

相關問題