Расширенные отношения коллекции Laravel (успешно или неудачно) - PullRequest
0 голосов
/ 04 мая 2018

Я использую 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);
}

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

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Это классическое отношение «многие ко многим» между 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 голосов
/ 04 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...