根据 Eloquent WhereHas Relationship 更改主查询的顺序
Change order of main query according to Eloquent WhereHas Relationship
$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 似乎不起作用。用户集合应按距离升序排列。
有什么建议吗?
您查询中的 Orderby 仅用于嵌套 select。如果你想按距离参数排序,你应该使用连接。尝试这样的事情:
更新:
$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);
$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 似乎不起作用。用户集合应按距离升序排列。
有什么建议吗?
您查询中的 Orderby 仅用于嵌套 select。如果你想按距离参数排序,你应该使用连接。尝试这样的事情:
更新:
$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);