Я использую 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);
}
Заранее большое спасибо за любую помощь! Вот уже два дня бью головой об стену!
Вы указали where('is_passing', 1)
, который находит только те, которые проходят. Удалить это утверждение. Вам может понадобиться поставить ->get()
в конце.
Это классические отношения между многими 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;
}
Надеюсь это поможет!