2017-08-10 57 views
1

我想獲取所有最近的項目,座標保存在列表表格中。 項目和列表是多對多的關係。 然後它會按距離或低到高排序。選擇其他表格的座標

$items = Item::with('listings') 
       ->select('*'); 
if($request->sortby == 'distance'){ 
     $items->distance($lat,$lng); 
     } 
if($request->sortby == 'low'){ 
     $items->groupBy('listings.id') 
       ->orderBy('items.price'); 
     } 
$items = $items->paginate(10); 

這是我距離

public function scopeDistance($query, $lat, $lng) { 
     return $query->addSelect(DB::Raw('(3959 * acos(cos(radians(' . $lat . ')) * cos(radians(listings.latitude)) * cos(radians(listings.longitude) - radians(' . $lng . ')) + sin(radians(' . $lat .')) * sin(radians(listings.latitude)))) AS distance')) 
        ->orderBy('distance'); 
    } 

項目模型,這需要listings.latitude和listings.longitude中保存的房源表。 該錯誤是

SQLSTATE [42S22]:未發現柱:1054未知列在 '字段列表'

並且如果 'listings.latitude' 排序從低到高價格

沒有找到

柱:1054未知列 'listings.id' 在 '組 聲明'

如何訪問/選擇這兩種座標和列表?

+0

這個組似乎對我來說不正確,因爲select中的所有字段在功能上都依賴於它的值。 – Shadow

+0

但我認爲真正的問題是'with'在幕後使用2個單獨的查詢,而不是帶連接的單個查詢。 – Shadow

回答

0

您的項目是項目的集合而不是模型,因此您無法在此對象上執行距離方法。您必須使用foreach並找出用戶位置與每個項目之間的距離。現在

foreach($items as $item) { 
    $distance=$item->distance($userPosition); 
} 

distance方法,你將計算用戶位置和項目之間的距離。

其次改變$items->groupBy('listings.id')$items->groupBy('listing_id')其中listing_iditems

0

場您可以使用加入的,而不是預先加載在這裏。

$items = Item::join('listings','listings.item_id','=','items.id') 
       ->select('*'); 

然後在這裏使用你的邏輯。

if($request->sortby == 'distance'){ 
     $items->distance($lat,$lng); 
     } 
if($request->sortby == 'low'){ 
     $items->groupBy('listings.id') 
       ->orderBy('items.price'); 
     } 
$items = $items->paginate(10);