2017-06-29 79 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后添加该列。

相关问题