Laravel Красноречивый запрос «многие ко многим» - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть many to many отношение между двумя таблицами, например, lecture и students (users).

Теперь, если lecture является приватным или ограниченным для приглашенных пользователей, только в таблице lecture_student есть записи в это с student_id.

lecture_student имеет student_id и ключи 'lecture_id'.

Так что, если лекция ограничена некоторыми студентами, то lecture_student будет иметь список всех user_id строки в нем, иначе он открыт для всех.

Когда пользователь входит в систему, я отображаю список Lectures, используя следующий запрос

Lecture::where('user_id', '<>',$logged_in_user->id)
    ->futureLectures() // query scope defined for future lectures only
    ->get()

Как получить лекцию для студента куда он или она приглашены и также открыты для всех?

Приведенный выше запрос дает мне все лекции о погоде student приглашается на это lecture или нет.

Я пытался whereHas но это не работает, потому что lecture_student таблица имеет запись только в случае, если lecture ограничено для некоторых пользователей, в случае открытия lecture, lecture_student не имеет строки.

Спасибо

1 Ответ

1 голос
/ 03 апреля 2020

Вы можете Наличие Отношения Запроса , чтобы получить лекции, куда был приглашен зарегистрированный студент

whereHas('students', function ($query) use ($logged_in_user) {
    $query->where('id', $logged_in_user->id);
})

и Отсутствие Отношения Запроса с orDoesntHave, чтобы получить тоже лекции, в которых нет связанных (приглашенных) студентов.

orDoesntHave('students')

Делайте это внутри Группы параметров .

Lecture::where(function ($query) use ($logged_in_user) {
        $query->whereHas('students', function ($q) use ($logged_in_user) {
                $q->where('id', $logged_in_user->id);
            })
            ->orDoesntHave('students');
    })
    ->futureLectures()
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...