Изменить порядок основного запроса в соответствии с Eloquent whereHas Relationship

#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’. 🙁