Php 根据与用户的距离进行Laravel搜索

Php 根据与用户的距离进行Laravel搜索,php,mysql,laravel,search,distance,Php,Mysql,Laravel,Search,Distance,嘿,所以我有一个搜索表单,它工作得非常完美,除了与用户的距离之外,我有点不知道如何让它工作,但这就是我所拥有的 public static function Search($input) { $date = \Carbon\Carbon::now()->subMinute(30); $query = User::rightJoin('user_profiles', 'users.id', '=', 'user_profiles.user_id'); if (iss

嘿,所以我有一个搜索表单,它工作得非常完美,除了与用户的距离之外,我有点不知道如何让它工作,但这就是我所拥有的

public static function Search($input)
{
    $date = \Carbon\Carbon::now()->subMinute(30);
    $query = User::rightJoin('user_profiles', 'users.id', '=', 'user_profiles.user_id');

    if (isset($input ['minAge']) && $input['minAge']) {
        $minAge = $input['minAge'];
        $maxDate = \Carbon\Carbon::today()->subYears($minAge)->endOfDay();
    }

    if (isset($input ['maxAge']) && $input['maxAge']) {
        if ($input['maxAge'] < $input['minAge']) {
            $maxAge = $input['minAge'];
        }
        else {
            $maxAge = $input['maxAge'];
        }
        $minDate = \Carbon\Carbon::today()->subYears($maxAge + 1);
    }

    if (isset($input['u']) && $input['u'])
        $query->where('users.username', '=', $input['u']);
    if (isset($input['p'])  && $input['p'])
        $query->where('user_profiles.postcode', '=', $input ['p']);
    if (isset($input['o1']) && $input['o1'])
        $query->where('users.last_online','>=',$date);
    if (isset($input['o2']) && $input['o2'])
        $query->whereNotNull('user_profiles.avatar');
    if (isset($input ['o3']) && $input['o3'])
        $query->orderBy('users.type', 'ASC');
    if (isset($input ['minAge']) && $input['minAge'])
        $query->whereBetween('user_profiles.dob', [$minDate, $maxDate]);
    if (isset($input ['g']))
        $query->whereIn('user_profiles.gender',$input ['g']);
    if (isset($input ['d']))
        $query->select('user_profiles.lat, user_profiles.long
            ( 6371 * acos( cos( radians(?) ) *
                       cos( radians( lat ) )
                       * cos( radians( long ) - radians(?)
                       ) + sin( radians(?) ) *
                       sin( radians( lat ) ) )
                     ) AS distance'
            )
        ->having("distance", "<", "?")
        ->orderBy("distance")
        ->setBindings([$input['lat'], $input['long'], $input['lat'],  $input['d']]);


    $query->orderBy('users.last_online', 'DESC');
    $users = $query->paginate(10);
    return $users;
}
公共静态函数搜索($input)
{
$date=\Carbon\Carbon::now()->subMinute(30);
$query=User::rightJoin('User_profiles'、'users.id'、'='、'User_profiles.User_id');
如果(isset($input['minAge'])&&$input['minAge']){
$minAge=$input['minAge'];
$maxDate=\Carbon\Carbon::today()->子年($minAge)->endOfDay();
}
if(isset($input['maxAge'])和&$input['maxAge'])){
如果($input['maxAge']<$input['minAge']){
$maxAge=$input['minAge'];
}
否则{
$maxAge=$input['maxAge'];
}
$minDate=\Carbon\Carbon::today()->子年($maxAge+1);
}
如果(isset($input['u'])&&$input['u'])
$query->where('users.username','=',$input['u']);
如果(isset($input['p'])&&$input['p'])
$query->where('user_profiles.postcode','=',$input['p']);
如果(isset($input['o1'])&&$input['o1'])
$query->where('users.last_online','>=',$date);
如果(isset($input['o2'])和&$input['o2'])
$query->whereNotNull('user_profiles.avatar');
如果(isset($input['o3'])和&$input['o3'])
$query->orderBy('users.type','ASC');
如果(isset($input['minAge'])&&$input['minAge'])
$query->whereBetween('user_profiles.dob',[$minDate,$maxDate]);
如果(isset($input['g']))
$query->where('user_profiles.gender',$input['g']);
如果(isset($input['d']))
$query->select('user\u profiles.lat,user\u profiles.long
(6371*acos(cos(弧度(?)*
cos(弧度(纬度))
*cos(弧度(长)-弧度(?)
)+sin(弧度(?)*
sin(弧度(纬度)))
)作为距离'
)

->有了“距离”,您需要使用
DB::raw()
来包装代码


看起来您从这里复制了代码,但删除了原始语句:

So$query->DB::raw()??因为我在使用join语句时尝试了这个方法,我不确定这是否可行。但是,我想将它与整个查询结合起来,我不确定如何将它应用到整个查询中。例如,是否可以执行$query=DB::select(如$query->DB::select(这类操作)