如何将参数绑定到模型中使用的Laravel中的原始数据库查询?

Mar*_*rkL 49 php mysql pdo laravel laravel-4

回覆,

我有以下查询:

$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();
Run Code Online (Sandbox Code Playgroud)

它不起作用:Invalid parameter number: mixed named and positional parameters.

有没有人知道一个技巧或解决方法(我显然可以编写完整的查询,但更喜欢使用流利的构建器).

Mar*_*rkL 89

好的,经过一些实验,这是我提出的解决方案:

$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();
Run Code Online (Sandbox Code Playgroud)

基本上,setBindings必须在查询上调用.希望这是有记录的!

  • 这是`setBindings(array $ bindings,$ type ='where')`的签名.如果你在WHERE子句中有一个绑定,那些就会被覆盖.您应该指定绑定是针对查询的SELECT部分​​的.` - > setBindings([$ lat,$ lng,$ lat,$ radius],'select')` (5认同)
  • +1 正在寻找这个确切的答案......包括地图半径查询。谢谢! (2认同)
  • setBindings似乎不支持PDO的命名参数:/ (2认同)
  • 例如,如果你正在处理一个关系,你应该使用 `addBinding` 而不是 `setBindings` 以避免覆盖关系绑定。 (2认同)

blu*_*777 26

旧问题,但如果我们必须重复一个变量,我们必须在绑定数组中更改其键值.

    $property = Property::select(
        DB::raw("title, lat, lng, ( 3959 * acos( cos( radians(:lat) ) * 
        cos( radians( lat ) ) * cos( radians( lng ) - radians(:lng) ) + 
        sin(radians(:lat_i) ) * sin( radians( lat ) ) ) ) AS distance"),
        ["lat" => $lat, "lng" => $lng, "lat_i" => $lat]);
Run Code Online (Sandbox Code Playgroud)

这就够了.

  • 在4.2中,您可以使用bindings作为whereRaw()中的第二个参数,但不能在DB :: raw()中使用.在上面的示例中,绑定将传递给select(),而不是DB :: raw(). (7认同)
  • 我收到错误“strtolower() 期望参数 1 为字符串,给定数组” (2认同)

小智 10

为什么不?

    $latitude = $request->input('latitude', '44.4562319000');
    $longitude = $request->input('longitude', '26.1003480000');
    $radius = 1000000;

    $locations = Locations::selectRaw("id, name, address, latitude, longitude, image_path, rating, city_id, created_at, active,
                         ( 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();
Run Code Online (Sandbox Code Playgroud)

  • 这是一个2年的问题.那时`selectRaw`不可用. (5认同)