#laravel #eloquent #geolocation #eloquent-relationship
#laravel #eloquent #геолокация #eloquent-взаимосвязь
Вопрос:
$collection = USER::whereHas('userLocations', function ($query) use ($filterId) {
$query->select(DB::raw('*, ( 6367 * acos( cos( radians('.$filterId['lat'].') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$filterId['lng'].') ) sin( radians('.$filterId['lat'].') ) * sin( radians( latitude ) ) ) ) AS distance'))
->having('distance', '<', 10)
->orderBy('distance);
});
$collection = $collection->paginate(config('p.number_of_rows'));
return $collection;
Я пытаюсь отобразить пользователя, диапазон местоположения которого находится от ближнего к дальнему. Похоже, что OrderBy не работает. Коллекция пользователей должна располагаться в порядке возрастания расстояния.
Любой совет был бы оценен?
Ответ №1:
Orderby в вашем запросе используется только для вложенного выбора. Вам следует использовать join, если вы хотите упорядочить по параметру distance. Попробуйте что-то вроде этого:
UPD:
$raw = '( 6367 * acos( cos( radians(' . $filterId['lat'] . ') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(' . $filterId['lng'] . ') ) sin( radians(' . $filterId['lat'] . ') ) * sin( radians( latitude ) ) ) )';
$collection = USER::select('users.*', DB::raw($raw . 'as distance'))
->join('userLocations', 'userLocations.user_id', '=', 'users.id')
->having(DB::raw($raw), '<', 10)
->orderBy($raw);
Комментарии:
1. Спасибо за ваш ответ. Но я получаю ошибку с неизвестным расстоянием между столбцами.
2. О, извините. Попробуйте упорядочить по вашему вычисленному значению: OrderBy(DB::raw(‘( 6367 * acos( cos( радианы(‘ . $filterId[‘широта’] . ‘) ) * cos ( радианы ( широта)) ) * cos (радианы ( долгота) — радианы (‘. $filterId[‘lng’] . ‘) ) sin (радианы (‘ . $filterId[‘lng’] . ‘)). ) * sin ( радианы ( широта ) ) ) )’)) (Поместите этот raw в переменную для двойного использования:)
3. -> присоединиться(‘user_locations’, ‘user_locations.user_id’, ‘=’, ‘users.id ‘) -> having($ qu, ‘<‘, 10) -> OrderBy($ qu); где $ qu — это предоставленный вами raw, но теперь я получаю неизвестный столбец ‘latitude’ в предложении ‘having’
4. Попробуйте изменить на: ->join(‘user_locations’, ‘user_locations.user_id’, ‘=’, ‘users.id ‘) ->имеющий(DB::raw($raw), ‘<‘, 10) -> OrderBy(DB::raw($raw));
5. получаю ту же ошибку.. Столбец не найден: 1054 неизвестных столбца ‘latitude’ в предложении ‘having’. 🙁