Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用拉维计算坐标距离_Php_Mysql_Laravel_Laravel 5_Eloquent - Fatal编程技术网

Php 用拉维计算坐标距离

Php 用拉维计算坐标距离,php,mysql,laravel,laravel-5,eloquent,Php,Mysql,Laravel,Laravel 5,Eloquent,我的模型中有一个创建别名的作用域,我需要在其上执行where,我知道MySql不允许这样做 标准SQL不允许在WHERE中引用列别名 条款施加此限制是因为当WHERE代码 执行时,可能尚未确定列值 然而,我想知道是否有一个可能的拉威尔工作附近? 我的范围创建了一个别名距离,我想检查该距离 public static function scopeDistance($query, $lat, $long) { return $query->select(array('*',\DB::r

我的模型中有一个创建别名的作用域,我需要在其上执行where,我知道MySql不允许这样做

标准SQL不允许在WHERE中引用列别名 条款施加此限制是因为当WHERE代码 执行时,可能尚未确定列值

然而,我想知道是否有一个可能的拉威尔工作附近? 我的范围创建了一个别名距离,我想检查该距离

public static function scopeDistance($query, $lat, $long)
{
    return $query->select(array('*',\DB::raw('( 3959 * acos( cos( radians(' . $lat . ') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(' . $long . ') ) + sin( radians(' . $lat .') ) * sin( radians(latitude) ) ) ) AS distance')));
} 
在我的控制器中:

\App\Profile::distance($latitude, $longitude)->where('distance', '<', 50);

\App\Profile::distance($latitude,$longitude)->where('distance','首先,不要忘记从函数调用中删除
static
关键字,Laravel处理神奇的静态外观
Profile::distance
调用

下面是解决同一问题的两个不同选项,在这两种情况下,您都可以从控制器调用
\App\Profile::distance($latitude,$longitude,50)

选项1

您可以在内存中进行计算,而不是处理子查询

public function scopeDistance($query, $lat, $long, $distance) {
    return Profile::all()->filter(function ($profile) use ($lat, $long, $distance) {
        $actual = 3959 * acos(
            cos(deg2rad($lat)) * cos(deg2rad($profile->latitude))
            * cos(deg2rad($profile->longitude) - deg2rad($long))
            + sin(deg2rad($lat)) * sin(deg2rad($profile->latitude))
        );
        return $distance < $actual;
    });
}

回答得很好!我想知道如何修改这个范围,以便将距离作为profiles表上的一个新列返回?
public function scopeDistance($query, $lat, $long, $distance) {
    return $query->having('distance', '<', $distance)
             ->select(DB::raw("*,
                     (3959 * ACOS(COS(RADIANS($lat))
                           * COS(RADIANS(latitude))
                           * COS(RADIANS($long) - RADIANS(longitude))
                           + SIN(RADIANS($lat))
                           * SIN(RADIANS(latitude)))) AS distance")
             )->orderBy('distance', 'asc')
              ->get();
}