仅在口才中获取指定ID的结果

时间:2019-06-26 08:10:10

标签: laravel eloquent spatie

我有一个小问题。我的代码可以正常工作,但是我认为我没有以正确的方式进行操作。

在我的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并不是很“有效”。

祝你有美好的一天。

2 个答案:

答案 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