首页  >  文章  >  数据库  >  如何在 Laravel 的 Eloquent Builder 中正确地将参数绑定到原始查询?

如何在 Laravel 的 Eloquent Builder 中正确地将参数绑定到原始查询?

DDD
DDD原创
2024-11-23 09:00:17555浏览

How to Correctly Bind Parameters to Raw Queries in Laravel's Eloquent Builder?

在 Laravel 的 Eloquent Builder 中将参数绑定到原始查询

在 Laravel 的 Eloquent 模型构建器中使用原始数据库查询时,可能很难正确绑定参数。尝试在同一查询中同时使用位置参数和命名参数时会出现一个常见问题。

问题中提供的查询说明了此问题:

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();

执行后,此查询失败并显示错误“参数号无效:混合命名和位置参数。”

要解决此问题,必须绑定显式使用 setBindings() 方法的参数。此方法按照参数在查询中出现的顺序接受参数数组。

以下是使用 setBindings() 方法修改后的查询:

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();

通过使用 setBindings()方法正确,现在可以成功执行查询,将参数绑定到原始 SQL 中的适当占位符。

以上是如何在 Laravel 的 Eloquent Builder 中正确地将参数绑定到原始查询?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn