如何将参数绑定到在Laravel中用于模型的原始数据库查询中?
如何将参数绑定到在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();
它无法工作:Invalid parameter number: mixed named and positional parameters
。
有人知道一个技巧或解决方法吗(我当然可以写完整的查询,但更愿意使用流畅的构造器)。
在Laravel中,当使用模型上的原始数据库查询时,如何将参数绑定到查询中是一个常见的问题。解决方法如下:
代码示例中的解决方案是使用setBindings
方法来绑定参数。这个方法需要在查询上调用。但是需要注意的是,setBindings
方法不支持PDO的命名参数。
如果你在使用关联关系的查询时,应该使用addBinding
方法而不是setBindings
方法,以避免覆盖关联关系的绑定。
setBindings
方法的签名是setBindings(array $bindings, $type = 'where')
。如果你在WHERE子句中有绑定,那么它们将被覆盖。你应该明确指定你的绑定是用于SELECT部分的查询。例如:->setBindings([$lat, $lng, $lat, $radius], 'select')
需要注意的是,绑定是按位置进行的。你仍然可以在代码中使用命名绑定来提高代码的可读性,比如:radians
,但它们将被视为无名绑定,即?
。
通过在查询中使用setBindings
方法,我们可以将参数绑定到原始数据库查询中。这个方法对于处理位置绑定非常有用,但不支持命名绑定。同时,如果你在使用关联关系的查询时,应该使用addBinding
方法来避免覆盖关联绑定。
参数绑定是为了在数据库查询中使用变量值而不是硬编码的值。在Laravel中,可以使用参数绑定来执行绑定的参数的原始数据库查询。但是,有时可能会遇到一个问题,即如何将参数绑定到在模型上使用的原始数据库查询。下面是解决此问题的原因和方法。
原因:
在给定的代码示例中,使用了`selectRaw`来执行原始数据库查询。但是,在此问题的早期版本中,`selectRaw`方法并不可用。因此,需要找到一种解决方案来绑定参数到原始查询以实现相同的功能。
解决方法:
为了解决这个问题,可以使用`select`方法来替代`selectRaw`方法,并对绑定的参数进行处理。下面是修改后的代码示例:
$latitude = $request->input('latitude', '44.4562319000'); $longitude = $request->input('longitude', '26.1003480000'); $radius = 1000000; $locations = Locations::select("id", "name", "address", "latitude", "longitude", "image_path", "rating", "city_id", "created_at", "active") ->selectRaw("( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance", [$latitude, $longitude, $latitude]) ->where('active', '1') ->having("distance", "<", $radius) ->orderBy("distance") ->get();
在上面的代码中,使用了`select`方法来选择要返回的列,并使用`selectRaw`方法来执行原始的计算。参数绑定通过在`selectRaw`方法的第二个参数中传递一个包含变量值的数组来实现。
通过这种方式,我们可以解决在Laravel中将参数绑定到模型上使用的原始数据库查询的问题。
以上是关于如何解决在Laravel中将参数绑定到模型上使用的原始数据库查询的问题的原因和解决方法。通过使用适当的方法和技巧,我们可以轻松地在Laravel应用程序中实现参数绑定,并以更安全和可靠的方式执行数据库查询。
问题的原因是在Laravel中使用原始数据库查询时,如果需要绑定参数,有时候需要更改绑定数组中的键值。解决方法是使用selectRaw()方法而不是DB::raw()方法,并将参数作为第二个参数传递。
在Laravel 4.2中,可以使用bindings作为whereRaw()方法的第二个参数,但无法在DB::raw()方法中使用。在上面的示例中,参数被传递给select()方法而不是DB::raw()方法。
有人遇到了一个错误"strtolower() expects parameter 1 to be string, array given"。但是,如果使用$modelClass::selectRaw($queryString, $arrayOfParameters)方法,一切都正常。
如果要在Laravel中将参数绑定到原始数据库查询,可以使用selectRaw()方法并将参数作为第二个参数传递,而不是使用DB::raw()方法。