Изменить порядок основного запроса в соответствии с Eloquent WhereHas Relationship - PullRequest
1 голос
/ 21 марта 2019
$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;

Я пытаюсь отобразить пользователя, чей диапазон местоположения находится от ближнего к дальнему.Порядок, похоже, не работает.Коллекция пользователей должна быть в порядке возрастания расстояния.

Любой совет будет оценен?

1 Ответ

1 голос
/ 21 марта 2019

Orderby в вашем запросе использует только для вложенного выбора. Вы должны использовать соединение, если вы хотите упорядочить по параметру расстояния. Попробуйте что-то вроде этого:

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);
...