我要实现的目标是允许老师将学生导入不同的班级。
注意:一个学生可以有多个班级。
问题是,当我在选择下拉列表中显示学生列表时,它应该返回所有学生,除了不在该班级中的学生(该班级是我所在的页面,app.com / classes / 5)例如)。
$students = User::join('group_user', 'users.id', '=', 'group_user.user_id')
->role('student')
->where('group_user.group_id', '!=', $id)
->orderBy('users.name', 'asc')
->get();
如果该班级的学生和另一个班级的学生的姓名出现在列表中,并且是重复的姓名,则此方法有效并显示所有不在该班级的学生但。
我该怎么办?
答案 0 :(得分:2)
打开MySQL的only_full_group_by模式时,这意味着使用GROUP BY时将应用严格的ANSI SQL规则
您应该尝试从架构中选择可以应用分组依据的字段,而不要选择*。
$students = User::join('group_user', 'users.id', '=', 'group_user.user_id')
->role('student')
->where('group_user.group_id', '!=', $id)
->select('users.id', 'other fields you used')
->orderBy('users.name', 'ASC')
->groupBy('users.id')
->get();
不输入在您的情况下也很有用
User::select('fields you used')
->role('student')
->whereNotIn('id', DB::table('group_user')->where('group_id', $id)->pluck('user_id')) // $id = 5
->orderBy('name', 'ASC')
->get();
答案 1 :(得分:1)
像这样修改查询以使用distinct()
;
$students = User::join('group_user', 'users.id', '=', 'group_user.user_id')
->role('student')
->where('group_user.group_id', '!=', $id)
->orderBy('users.name', 'ASC')
->distinct()
->get();
您也可以groupBy('users.id')
$students = User::join('group_user', 'users.id', '=', 'group_user.user_id')
->role('student')
->where('group_user.group_id', '!=', $id)
->orderBy('users.name', 'ASC')
->groupBy('users.id')
->get();