#laravel #eloquent
Вопрос:
Я работаю над системой автобусных маршрутов. Маршрут может иметь несколько остановок (местоположений).
У меня есть следующая структура таблицы:
Автобус
- ID
- Имя
- идентификатор маршрута
маршрут
- ID
- Имя
route_locations*
- ID
- идентификатор маршрута
- идентификатор места
- приказ
- старт (начало автобусного маршрута — 1 = истина, 0 = ложь)
- конец (последняя остановка — 1 = истина, 0 = ложь)
места
- ID
- Имя
- слизень
Поэтому, когда кто-то ищет доступный автобус, у нас есть $от и $до в виде пули. Пример: от-это «местоположение-a», а до-это «местоположение-d».
Я пытаюсь вернуть коллекцию доступных автобусов, которые обслуживают этот маршрут. Я пытаюсь сделать это в одном запросе вместо того, чтобы снова просматривать результаты и сопоставлять их друг с другом.
$from = $request->from;
$to = $request->to;
$busses = Bus::whereHas('route', function ($query) use ($from, $to) {
$query->whereHas('locations', function ($query) use ($from, $to) {
$query->whereHas('place', function($query) use ($from, $to) {
$query->where('slug', $from)
->where('end', '!=', 1);
})
->whereHas('place', function ($query) use ($to) {
$query->where('slug', $to)
->where('start', '!=', 1);
});
});
})->get();
маршрут, места и место-это мои отношения. Они прекрасно работают.
Когда я удалю второй запрос whereHas («место»), он вернет автобус, маршрут которого имеет правильное начальное местоположение. Но я пытаюсь ездить только на автобусах, где маршрут имеет местоположение » от «и в правильном «порядке», где » от «всегда ниже, чем «до», если это имеет смысл? Следующий «заказ» всегда должен быть выше.
Возможно, я делаю что-то не так, так как вышеизложенное не возвращает правильных результатов. Я не уверен, возможно ли вообще с помощью красноречивого вести двойную игру в одних и тех же отношениях.
Пожалуйста, помогите мне.
Спасибо!
Комментарии:
1. попробуйте использовать этот код
$busses = Bus::whereHas('route.locations.place', function ($query) use ($from, $to) { $query->where('slug', $from)->where('end', '!=', 1);})->whereHas('route.locations.place', function ($query) use ($from, $to) {$query->where('slug', $to)->where('start', '!=', 1);})->get();
2. Запрос работает, но я уже понял это, но он все равно не проверяет, выше ли столбец «порядок», чем предыдущий. У $to должен быть столбец «заказ» с более высоким значением, чем у $from. Спасибо.