使用paginate进行Laravel Complex Eloquest查询

时间:2016-01-11 08:37:51

标签: php google-maps laravel-5

我是laravel的新人,我是'使用谷歌地图开发应用程序,用户搜索位置,然后返回特定半径的地点。但我陷入了如何在Eloquent中写下代码的问题。我的疑问是:

$lat    = $request->input( 'lat' );
$lng    = $request->input( 'lng' );
$dist   = $request->input( 'dist' );

$query  = "SELECT *, ( 6371 * acos( cos( radians('$lat') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('$lng') ) + sin( radians('$lat') ) * sin( radians( lat ) ) ) ) AS distance FROM locations WHERE lat != '$lat' AND lng != '$lng' HAVING distance <= $dist ORDER BY id DESC";

我试过了:

   $locations = \DB::table( 'locations' )->select(['*', "( 6371 * acos( cos( radians('$lat') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('$lng') ) + sin( radians('$lat') ) * sin( radians( lat ) ) ) ) as distance"])->paginate(5);

但它似乎无法正常工作。而是显示此错误:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* from `locations` limit 5 offset 0' at line 1 (SQL: select *, `(` as * from `locations` limit 5 offset 0)

请帮我弄明白这个问题。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您只需以DB::select("SELECT *, ( 6371 * acos( cos( radians('$lat') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('$lng') ) + sin( radians('$lat') ) * sin( radians( lat ) ) ) ) AS distance FROM locations WHERE lat != '$lat' AND lng != '$lng' HAVING distance <= $dist ORDER BY id DESC")->paginate(5); 方法传递SQL查询,例如:

-- correct types of columns
DECLARE @temp1 TABLE(
    RowNum int
    ,BillDate datetime
    ,BillNo int
    ,NarrationNumber int
    ,TotalAmount money
    ,RecievedAmount money
    ,DueAmount   money
)

参考文献: https://laracasts.com/discuss/channels/laravel/how-to-convert-google-map-sql-query-as-laravel-query

答案 1 :(得分:0)

您可以执行raw db查询注入,因此Laravel不会处理和损坏它:     选择(         DB:原料(             “*,(6371 * acos(cos(弧度('$ lat'))* cos(弧度(纬度))* cos(弧度(lng) - 弧度('$ lng'))+ sin(弧度('$ lat) '))* sin(弧度(纬度))))作为距离“         )     )

验证和预先计算radians('$lat')radians('$lng')

是否有意义

作为一个选项,您可以选择所有id, lat, lon,使用某个函数计算脚本中的距离,按距离过滤ID,然后从db中选择记录。它会更具可读性。

您还可以创建一个存储的MySQL函数来进行这些计算。

如果您的距离计算功能正常工作,后两种方式可让您测试。