Расширенные отношения коллекции Laravel

Я использую Laravel 5.6. У меня есть три модели: пользователь, попытка, оценка. Мне нужно выяснить, какие оценки пользователь прошел или не сдал. Когда пользователь проходит оценку, модель попытки будет сохранена с логическим значением is_passing true или false. Ниже моя структура базы данных.

User
ID | name

Attempt
ID | assessment_id | user_id | is_passing (bool)

Assessment
ID | name

Я работаю в файле модели User.php и пытаюсь создать коллекцию, чтобы иметь возможность просматривать оценки как таковые

@foreach($user->assessmentsPassOrFail as $assessment)
@if($assessment->passed)
{{ $assessment->name }}
@else
<a href="link to assessment">{{ $assessment->name }}</a>
@endforeach

У меня есть следующее в моем User.php, но его нужно настроить, чтобы показывать все оценки (проходить или не проходить), а не просто проходить.

public function attempts()
{
return $this->hasMany('App\Models\Attempt');
}

public function assessmentsPassOrFail(){
return $this->attempts()->with('assessment')->where('is_passing', 1);
}

Заранее большое спасибо за любую помощь! Вот уже два дня бью головой об стену!

0

Решение

Вы указали where('is_passing', 1), который находит только те, которые проходят. Удалить это утверждение. Вам может понадобиться поставить ->get() в конце.

0

Другие решения

Это классические отношения между многими User а также Assessment, где Attempt действует как объединяющий стол. Смотрите документацию Laravel здесь, а именно: https://laravel.com/docs/5.6/eloquent-relationships#many-to-many

В вашем случае я бы переписал вашу функцию оценки, чтобы отразить характер ее связи с User:

public function assessments()
{
return $this->belongsToMany('App\Models\Assessments', 'Attempt')->withPivot('is_passing');
}

belongsToMany Метод полагается на некоторые соглашения Laravel, чтобы имена таблиц и столбцов работали «из коробки», но все они могут быть определены специально для случаев, которые не следуют ожидаемым соглашениям. В этом случае Laravel ожидает, что объединяющая таблица будет названа assessment_userи ожидал бы, что имена других таблиц будут множественными, а все строчными. Так что вам, возможно, придется явно определить параметры в belongsToMany метод, чтобы он работал правильно. Подробности смотрите здесь: https://laravel.com/api/5.6/Illuminate/Database/Eloquent/Model.html#method_belongsToMany

withPivot Метод определяет, какие поля из объединяемой таблицы должны быть получены при использовании этого отношения. Теперь вы можете получить это значение следующим образом:

$user = App\Models\User::find(1);

foreach ($user->assessments as $a) {
echo $a->pivot->is_passing;
}

Надеюсь это поможет!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector