【问题标题】:Laravel 4.2 How to convert my SQL code into Laravel standardsLaravel 4.2 如何将我的 SQL 代码转换为 Laravel 标准
【发布时间】:2023-03-20 06:55:01
【问题描述】:

我想使用基于 Laravel 标准的 SQL 代码。此代码在我的其他项目中运行良好。我想将它添加到我的控制器函数中,并以最简单的方式将此 SQL 代码转换为 Laravel 标准。有人知道该怎么做吗?

这是我的代码:

SELECT SQL_CALC_FOUND_ROWS a.*, ( $distance_exp * acos( cos( radians($lat) ) * cos( radians( latitude ) ) 
                * cos( radians( lontitude ) - radians($long) ) 
                + sin( radians($lat) ) * sin( radians( latitude ) ) ) ) 
                AS distance                             

                FROM {{driver}} a 
                HAVING distance < $max_radius           
                $and
                ORDER BY is_sponsored DESC, distance ASC
                LIMIT 0,100

到目前为止,这是我尝试过的,但它仍然给我一条错误提示消息:

public function val_getdistance() 
{
  //sample value
   $radius=3;
   $property = 
        Driver::select(
    DB::raw("title, latitude, longitude, ( 3959 * acos( cos( radians(:latitude) ) * 
    cos( radians( latitude ) ) * cos( radians( longitude ) - radians(:longitude) ) + 
    sin(radians(:lat_i) ) * sin( radians( latitude ) ) ) ) AS distance"),
    ["latitude" => $lat, "longitude" => $lng, "lat_i" => $lat])
->having("distance", "<", "$radius")
->orderBy("distance")
->take(20)
->setBindings([$lat, $lng, $lat,  $radius])
->get();

dd($property);
}

【问题讨论】:

  • 向我们展示错误信息。
  • 未定义变量:纬度
  • 您在val_getdistance() 中定义的唯一变量是$radius - $lat$lng 未定义。您的意思是将它们作为参数传递吗?或者将它们设置在您设置$radius的位置?
  • 我想将它们设置为我的$radius 的设置位置。
  • 简单,定义$lat$lng

标签: php sql laravel latitude-longitude radius


【解决方案1】:

您需要将值发送到函数,所以它可能看起来像这样,因为 $lng$lat 没有在任何地方定义

public function val_getdistance($lng, $lat) 
{
  //sample value
   $radius=3;
   $property = 
        Driver::select(
    DB::raw("title, latitude, longitude, ( 3959 * acos( cos( radians(:latitude) ) * 
    cos( radians( latitude ) ) * cos( radians( longitude ) - radians(:longitude) ) + 
    sin(radians(:lat_i) ) * sin( radians( latitude ) ) ) ) AS distance"),
    ["latitude" => $lat, "longitude" => $lng, "lat_i" => $lat])
->having("distance", "<", "$radius")
->orderBy("distance")
->take(20)
->setBindings([$lat, $lng, $lat,  $radius])
->get();

dd($property);
}

通过此声明,您将自己向函数发送 lng 和 lat(猜测您需要它们是动态的),您可以在函数声明中添加您需要的任何其他参数。 如果您需要静态,您可以声明 $radius 的位置,因此在半径下方/上方添加这样的代码,其余代码保持不变:

$lng = 42.2039;
$lat = 29.3901;

或任何您需要的值。

希望这会有所帮助。

【讨论】:

  • 我希望它是动态的,从我的数据库中检索到的 $lat 和 $lang 的值。
  • 然后使用你发送 $lat 和 $lng 到函数的代码的第一部分
  • 缺少 OwnerController::val_getdistance() 的参数 1
  • 如果函数声明中有 2 个变量,你需要在调用函数时发送它们,例如你在另一个函数中使用它,那么你需要像 val_getdistance($var1, $var2) 一样调用它;其中 $var1 和 $var2 将是您的 lat 和 lng 的值(因此在转换后它看起来像这样 val_getdistance(23.9309,32.3903); )。对于变量,您可以以任何方式获取它们,您可以为第二个表编写另一个查询,从中获取 lat/lng(可能是最好的解决方案)
猜你喜欢
  • 1970-01-01
  • 2015-08-19
  • 2019-11-11
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多