Есть запрос, который осуществляет выборку ближайших к пользователю аукционов и музеев
$query = Location::select(DB::raw("location.id, location_label as location, latitude, longitude,
(6371 * acos( cos( radians($lat) )
* cos( radians( latitude ) )
* cos( radians( longitude ) - radians($lng) ) + sin( radians($lat) )
* sin( radians( latitude ) ) ) )
AS distance"));
$query->orderBy('distance');
$query = $query->with('auctions:id, location_id')->with('museums:id, location_id');
return $query->get();
В результате запроса получаем
[
{
"id": 2,
"location": "Milan",
"latitude": "51.5073509",
"longitude": "-0.1277583",
"distance": 0,
"auctions": [
{
"id": 2,
"title": "Тайтл",
"location_id": 2
}
],
"museums": [
{
"id": 2,
"name": "Museum",
"location_id": "2"
}
]
},
{
"id": 3,
"location": "London",
"latitude": "51.5073509",
"longitude": "-0.1277503",
"distance": 0.0005453617665334611,
"auctions": [],
"museums": [
{
"id": 1,
"name": "Museum",
"location_id": "3"
}
]
}
]
Нужно, чтобы суммарное количество аукционов и музеев не превышало 4.
Т.е. на фронте это будет выводиться списком:
- Аукцион1. Расстояние 1км.
- Музей1. Расстояние 1км.
- Музей2. Расстояние 1,5км.
- Аукцион2. Расстояние 1,5км.
И нужно организовать пагинацию по 4 штуки на страницу.
Можно ли как-то переписать данный запрос оптимальнее под поставленную задачу?
Или foreach'ем пройтись и посчитать суммарное кол-во аукционов и музеев? А если offset будет 10000, получается сперва нужно пройтись по этим 10000 аукционам/музям форичем, чтобы определить следующие 4 записи, такое себе решение, по-моему.