在 Laravel 中处理复杂的原始数据库查询时,绑定参数对于防止错误至关重要。使用基于模型的方法时经常会出现这种情况。
考虑用户遇到的以下查询:
$property = Property::select( DB::raw("title, lat, lng, ( 3959 * acos( cos( radians(:lat) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(:lng) ) + sin( radians(:lat) ) * sin( radians( lat ) ) ) ) AS distance", ["lat" => $lat, "lng" => $lng, "lat" => $lat]) ) ->having("distance", "<", $radius) ->orderBy("distance") ->take(20) ->get();
此查询尝试根据属性与给定点的距离来过滤属性使用原始 SQL 计算。但是,由于混合命名参数和位置参数,会出现错误。
要解决此问题,应该利用 setBindings 方法,该方法允许显式指定查询的绑定。以下是修改后的工作代码:
$property = Property::select( DB::raw("title, lat, lng, ( 3959 * acos( cos( radians( ? ) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians( ? ) ) * sin( radians( lat ) ) ) ) AS distance") ) ->having("distance", "<", "?") ->orderBy("distance") ->take(20) ->setBindings([$lat, $lng, $lat, $radius]) ->get();
通过在原始 SQL 中使用位置占位符 (?) 并使用适当的值数组调用 setBindings,可以正确执行查询,将参数绑定到适当的占位符.
以上是如何在 Laravel 中的复杂原始查询中正确绑定参数?的详细内容。更多信息请关注PHP中文网其他相关文章!