Использование whereHas()
- это ответ на ваши опасения по поводу получения идентификаторов.Вместо выполнения дополнительных запросов для получения идентификаторов whereHas()
будет прикреплять ограничение к исходному запросу в качестве подзапроса для связанных таблиц.
Разбиение запроса на его части:
1:Ответ
2: Предполагается, что обратное значение $ track-> уроки равно $ lesson-> track, а $ track исходит из кода, который вы не включили:
$lessons = Lesson::whereHas('tracks', function ($query) use ($track) {
$query->where('id', $track->id);
})
3: Предполагаяобратное значение $ title-> уроки равно $ lesson-> title:
$lessons = Lesson::where(function ($query) use ($title) {
$query->whereHas('titles', function ($query) use ($title) {
$query->where('id', $title->id);
})
->orWhere('limited_by_title', false);
})
Объединено обратно в одно:
$track = ???;
$title = Auth::user()->title;
$lessons = Lesson::where('active', true)
->whereHas('tracks', function ($query) use ($track) {
$query->where('id', $track->id);
})
->where(function ($query) use ($title) {
$query->whereHas('titles', function ($query) use ($title) {
$query->where('id', $title->id);
})
->orWhere('limited_by_title', false);
})
->get();
Если это все еще не дает ожидаемых результатовВы можете проверить полный запрос, заменив get()
на toSql()
.Иногда работа с ORM в качестве отправной точки вместо SQL может привести вас по неверному пути.Для более подробной информации об отладке и понимании выполняемых запросов вы можете включить ведение журнала запросов: https://laravel.com/docs/5.7/database#listening-for-query-events