@foobarsik
#Laravel #Vue

Как убедиться, что суммарное кол-во вложенных ресурсов не превышает определенного кол-ва?

Есть запрос, который осуществляет выборку ближайших к пользователю аукционов и музеев
$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 записи, такое себе решение, по-моему.
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 1
dlnsk
@dlnsk
ПК Партнер 01.01 -> ПК Поиск -> IBM PC
Не могу понять в чем смысл Location...
Почему музеи и аукционы привязаны к городу? Т.е. если я нахожусь в Лондоне, то все лондонские музеи от меня на расстоянии 1,5 км что-ли? Если вам нужно расстояние до пользователя, так и храните свои координаты у каждого музея и аукциона. Сами аукционы и музеи лежат в одной таблице (название, тип, координаты). Различайте по типу. Если у них есть сильно отличающиеся поля, то можно их хранить в разных таблицах вот так: https://laravel.com/docs/6.x/eloquent-relationship...
В таком случае простой пагинацией выводите хоть по 4, хоть по 10.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы