我正在更新基于Laravel的API。
使用Eloquent DB模型我已经写了一个范围来缩小我的查询范围到我们需要的范围。
我面临的问题是我们正在尝试将纬度/经度合作传递给查询,在查询中,它们应该用于拉出给定点的某个半径范围内的用户。
手动输入时查询工作正常,但在调用范围后转储SQL时,它已经转义了。在浮子内。
代码:
public static function scopeInRadius($query, $lat, $lng, $distance = 50)
{
$qstring = '
( 3959 * acos(
cos( radians( '.$lat.') )
* cos( radians( latitude ) )
* cos( radians( longitude) - radians('.$lng.') )
+ sin( radians( '.$lat.') )
* sin( radians( latitude ) )
)
)';
return $query->where($qstring, '<', $distance);
}
在var_dump()'ing
->toSql()
上,我看到了以下输出:
string 'select * from `users` where `users`.`deleted_at` is null and `
( 3959 * acos(
cos( radians( 53`.`258100) )
* cos( radians( latitude ) )
* cos( radians( longitude) - radians(2`.`127400) )
+ sin( radians( 53`.`258100) )
* sin( radians( latitude ) )
)
)` < ?' (length=376)``
我确信必须有一种相当简单的方法来逃避这些时期,尽管我还是找不到它!任何帮助将不胜感激!
答案 0 :(得分:2)
使用 whereRaw 而不是 where ,只是为了安全起见,请确保将参数转换为float:
$lng = floatval($lng);
$lat = floatval($lat);
$distance = floatval($distance);
return $query->whereRaw($qstring . ' < ' . $distance);
答案 1 :(得分:1)
qstring变量的值应为
$qstring = "
( 3959 * acos(
cos( radians( ".$lat.") )
* cos( radians( latitude ) )
* cos( radians( longitude) - radians(".$lng.") )
+ sin( radians( ".$lat.") )
* sin( radians( latitude ) )
)
)";