我有一个小问题。我的代码可以正常工作,但是我认为我没有以正确的方式进行操作。
在我的GradeController中,我有以下代码:
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
if(auth()->user()->hasRole('Student')) {
$subjects = Subject::all();
return view('grades.student.index', compact('subjects'));
}
}
在我看来,我正在通过以下方式获得属于指定用户的成绩:
@foreach($subject->grades->where('student_id', '=', auth()->user()->id) as $grade)
<span class="badge badge-primary">
{{ $grade->value }}
</span>@endforeach
在这里,我是说Laravel,还有更好的方法吗?因为我认为获取属于一个主题的所有成绩然后查找ID并不是很“有效”。
祝你有美好的一天。
答案 0 :(得分:1)
您可以使用with()
急切加载帮助器,并带有一个闭包,该闭包将根据登录用户的等级过滤subject
的'grades':
$subjects = Subject::with(['grades' => function($query) {
$query->where('student_id', auth()->user()->id);
}])->get();
请注意在, '=',
子句中删除了->where()
。如果检查是否等于,则不需要此参数。
答案 1 :(得分:0)
在您的控制器index()
中,您可以制作中间件而不是多次进行此检查auth()->user()->hasRole('Student')
,如果您只在这里检查一次,那就买就可以了。
public function index()
{
// refactoring
return view('grades.student.index', ['subject' => Subject::all()]);
}
在刀片文件中进行查询也不是一件好事,因此您可以直接从控制器传递grades
public function index()
{
return view('grades.student.index', [
'grades' => Grade::where('student_id', auth()->id())->get()
]);
}
现在可以在index
刀片文件中使用:
@foreach($grades as $grade)
<span class="badge badge-primary">
{{ $grade->value }}
</span>
// you can get the subject from $grade->subject
@endforeach