我是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)
请帮我弄明白这个问题。提前谢谢。
答案 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函数来进行这些计算。
如果您的距离计算功能正常工作,后两种方式可让您测试。