2016-01-11 81 views
0

我是laravel的新手,我正在開發一個應用程序,使用谷歌地圖在用戶搜索位置,然後返回特定半徑的地方。但我陷入瞭如何在Eloquent中寫下代碼。我的查詢是:Laravel Complex Eloquest Query with paginate

$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

你可以通過你的SQL查詢的DB::select()方法,例如:

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

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

+0

那麼我該如何在這個方法中應用paginate()?這是拋出錯誤:調用成員函數paginate()在數組 – Pranab

+0

我使用以下工作: \ DB :: table('locations') - > select(\ DB :: raw(「*」 ,(6371 * acos(弧度('$ lat'))* cos(弧度(lat))* cos(弧度(lng) - 弧度('$ lng'))+ sin(弧度('$ lat')) )* sin(radians(lat))))AS distance「)) - > paginate('2'); – Pranab

+0

對於遲到的回覆感到抱歉,所以它現在正在工作?對不起,我只是沒有測試你的情況。 –

0

你可以做一個raw db SQL注入,這樣就不會被處理和破壞通過Laravel: select( Db :: raw( 「*,(6371 * acos(cos(radians('lat'))* cos(弧度(lat))* cos(弧度(lng) - 弧度(' $ lng'))+ sin(弧度('$ lat'))* sin(弧度(lat))))as di立場」 ) )

也許是有意義的距離,然後驗證並預​​先計算radians('$lat')radians('$lng')

你可以選擇所有的id, lat, lon一種選擇,計算出你的腳本的距離與一些功能,過濾ID從數據庫中選擇記錄。它會更具可讀性。

你也可以創建一個存儲的MySQL函數來進行這些計算。

後兩種方式提供讓你測試,如果你的距離計算功能正常工作。