Я не понимаю, почему это не работает:Laravel: Фильтровать вложенные отношения?
Device::with(['travel.move.position' => function($q) use ($start, $end) {
return $q->whereBetween('created_date', [$start, $end]);
}]);
Я думаю, что он должен дать мне все устройства с travel->move->position
отношений, но только те, которые position.datetime
между $start
и $end
Я пытался что-то вроде
Device::whereHas('travel.move.position', function($q) use ($start, $end) {
return $q->whereBetween('created_date', [$start, $end]);
});
, и я получаю ожидаемый результат, но я не получаю нетерпеливых отношений.
ADDED QUERY ДЛЯ ОТВЕТА 1:
select *
from `devices`
where exists (
select * from `travels`
inner join `travel_info` on `travel_info`.`id` = `travels`.`info_id`
where `devices`.`id` = `travel_info`.`device_id`
and exists (
select *
from `moves`
where `moves`.`travel_id` = `travels`.`id`
and exists (
select * from `positions`
where `moves`.`position_id` = `positions`.`id` and `created_at`
between ? and ?
)
)
Запрос совершенна (как было whereHas), но когда делать с():
select `travels`.*, `travel_info`.`device_id`
from `travels`
inner join `travel_info` on `travel_info`.`id` = `travels`.`info_id`
where `travel_info`.`device_id` in (?, ?, ?)
....
select * from `moves` where `moves`.`travel_id` in (?, ..., ?)
....
select * from `positions` where `positions`.`id` in (?, ..., ?)
Этот код только фильтрование 'position', а не 'device'. Таким образом, вы все равно получите все устройства, но внутри каждого устройства -> перемещение -> перемещение, вы увидите только позиции, соответствующие вашему фильтру. –
Действительно ли ваше поле называется 'datetime'? Поскольку это зарезервированное слово в mysql: http://dev.mysql.com/doc/refman/5.7/en/keywords.html Я думаю, что вам может потребоваться процитировать его 'whereBetween ('' datetime'', [$ start, $ end]); ' – Cyclonecode
попробуйте добавить' с ('travel.move.position') 'к вашему второму запросу. Затем он дает ожидаемый результат и нетерпеливые загруженные отношения. –