Получение результата только для указанного идентификатора в Eloquent - PullRequest
0 голосов
/ 26 июня 2019

У меня маленькая проблема.Мой код работает, но я думаю, что я делаю это неправильно.

В моем 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, есть какой-нибудь лучший способ сделать это?Потому что я думаю, что получение всех оценок, которые принадлежат субъекту, а затем поиск идентификатора, не очень «эффективно».

Хорошего дня.

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вы можете использовать with() готовый помощник по загрузке с закрытием, которое отфильтрует subject 'оценки' на основе оценки, принадлежащей зарегистрированному пользователю:

$subjects = Subject::with(['grades' => function($query) {
    $query->where('student_id', auth()->user()->id);
}])->get();

Обратите внимание на удаление , '=', в предложении ->where(). Он не нуждается в этом аргументе, если проверяется, равен ли он.

0 голосов
/ 26 июня 2019

В вашем контроллере 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 
...