当前位置: 首页 > 知识库问答 >
问题:

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

郎鸿雪
2023-03-14

重新,

我有以下疑问:

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

它不起作用:无效参数编号:混合命名参数和位置参数

是否有人知道一个技巧或解决方法(我显然可以编写完整的查询,但更喜欢使用fluent builder)。

共有3个答案

卫飞鹏
2023-03-14

为什么不呢?

    $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();
王佐
2023-03-14

老问题,但是如果我们必须重复一个变量,我们必须在绑定数组中更改它的键值。

    $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]);

这就够了。

微生城
2023-03-14

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

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

基本上,必须对查询调用setBindings。但愿这是有案可查的!

 类似资料:
  • 问题内容: 回覆, 我有以下查询: 它不起作用:。 有谁知道技巧或解决方法(我显然可以编写完整的查询,但更喜欢使用流利的生成器)。 问题答案: 好,经过一些实验,这是我想出的解决方案: 基本上,必须在查询上调用。希望记录在案!

  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 6年前关闭。 我有一个mysql查询,但无法为其绑定参数 我已经试过了 但我收到了并且出错了: 警告:mysqli_stmt :: bind_param():类型定义字符串中的元素数量与绑定变量的数量不

  • 我试图运行这个简单的原始sql语句与参数SQLALChemy(在一个alembic脚本): 我得到以下错误: 解决方案:

  • 问题内容: 我出于性能原因使用此sql 但是我有一个例外 有什么解决方法可以让我将列表绑定到’in’子句的参数? 问题答案: 对旧问题的新答案,因为自从首次发布此问题/接受的答案以来,似乎某些基本功能已发生更改(如@vicvicvic在@Gary的答案中所暗示的,但我认为它应该是提高可见度的答案) 。 现在支持类型修改,类型修改除了其他功能外,还允许将列表传递到查询中的单个参数化值中。这也可以在S

  • 问题内容: 现在,我需要使用以下结构来将多个参数绑定到mysqli查询中: 我使用以下代码计算出问号的数量,并将其插入查询中: 我的问题是,肯定有一种方法可以动态处理查询中尽可能多的输入。硬编码似乎是处理此问题的一种非常糟糕的方法。 我正在使用PHP版本5.4.10 问题答案: 不幸的是,默认情况下,bind_param()不接受数组而不是单独的变量。但是,自PHP 5.6起,将进行重大改进。 要