2017-08-10 24 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); 

これは、これはリストテーブルに保存されているlistings.latitudeとlistings.longitudeを必要と距離

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

のための私の項目モデルです。 エラーが

SQLSTATE [42S22]である:カラム見つかりません: 'フィールドリスト'

と高価格に低

ソートの場合で1054不明な列 'listings.latitude'

列が見つかりません:1054不明な列 'listings.id' 'グループ 声明'

これらの2つの種類の座標とリストへのアクセス/選択方法は?

+0

selectのすべてのフィールドがその値に機能的に依存しているわけではないため、グループは誤っているようです。 – Shadow

+0

しかし、実際の問題は、 'with'がジョインで1つのクエリではなく、2つの別々のクエリをシーンの裏で使用するということです。 – Shadow

答えて

0

あなたの商品はモデルではない商品のコレクションです。したがって、あなたはこのオブジェクトで距離法を実行することはできません。 foreachを使用して、ユーザーの位置と各アイテムとの距離を見つける必要があります。

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

distanceメソッドでは、ユーザーの位置とアイテムの距離を計算します。

第二listing_iditemsテーブル

0

のフィールドであるあなたがここに代わりに積極的なロードの結合を使用する$items->groupBy('listing_id')する$items->groupBy('listings.id')を変更します。

$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); 
関連する問題