【问题标题】:Laravel query escaping the period (.)Laravel 查询转义句点 (.)
【发布时间】:2015-07-16 11:13:26
【问题描述】:

我正在更新基于 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 -&gt;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)``

我确信必须有一个相当简单的方法来逃避这些时期,尽管我还没有找到它!任何帮助将不胜感激!

【问题讨论】:

    标签: php mysql eloquent laravel-5


    【解决方案1】:

    使用 whereRaw 而不是 where,只需确保出于安全原因将参数转换为浮动即可:

    $lng = floatval($lng);
    $lat = floatval($lat);
    $distance = floatval($distance);
    
    return $query->whereRaw($qstring . ' < ' . $distance);
    

    【讨论】:

    • 正确,成功了。谢谢,我不知道whereRaw() 方法。非常感谢!
    【解决方案2】:

    你的 qstring 变量的值应该是

    $qstring = "
        ( 3959 * acos(
            cos( radians( ".$lat.") )
          * cos( radians( latitude ) )
          * cos( radians( longitude) - radians(".$lng.") )
          + sin( radians( ".$lat.") )
          * sin( radians( latitude ) )
                     )
        )";
    

    【讨论】:

    • 谢谢,不幸的是,这会导致非常相似的输出: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 ) ) ) )` &lt; ?' (length=350) 我正在权衡将其作为字符串强制输入,然后再将其转换回来,虽然有点 hacky...--编辑:我无法将其格式化为代码!
    • 不幸的是,仍然是相同的输出。直接针对 MySQL 运行 $qstring 部分会给出正确的预期结果 - 只是一旦它被强制到 Eloquent 的 -&gt;where() 中,它似乎被 str_replace'd 因为它认为它们是列分隔符。
    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2021-09-13
    • 2021-09-18
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多