Laravel, где есть отношения - PullRequest
3 голосов
/ 01 апреля 2019

Я делаю приложение Laravel для управления событиями. Attendant и и Event имеют отношение к принадлежащему пользователю. Дежурный имеет несколько событий и наоборот. Столбец сводки имеет дополнительное поле с именем uuid, это похоже на идентификатор заявки на событие. Мне нужно подтвердить вход сопровождающего на мероприятие. Таким образом, оператор сканирует QR-код с помощью uuid сводной таблицы.

Итак, у меня есть эта функция

public function validateTicket(Request $request, $ticket) {
    $event = Event::fromTicket($ticket);
    \Log::info($event);
    return new EventResource($event);
}

И статический метод fromTicket:

public static function fromTicket($ticket) {
    return static::whereHas('attendants', function($q) use ($ticket) {
        $q->where('uuid', $ticket);
    })->first();
}

Проблема в том, что мне тоже нужны отношения, потому что мне нужно зарегистрировать час входа оператора, и этот вход может происходить много раз.

Есть ли способ вернуть отношения также во время запроса whereHas?

Заранее спасибо.

1 Ответ

0 голосов
/ 01 апреля 2019

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

public static function fromTicket($ticket) {
    return static::whereHas('attendants',
        function($query) use ($ticket) {
            $query->where('uuid', $ticket);
        })->with(['attendants' => function ($query) use ($ticket) {
            $query->where('uuid', $ticket);
        }])->first();
}

Сюда войдут только участники, но только с правильным билетом, так что теперь вы можете выполнить $event->attendants->first(), это два запроса, все еще довольно оптимизированные, но не оптимальные, мое самое простое решение для того, как вы изобразили свою проблему.

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