我想获取所有最近的项目,坐标保存在列表表格中。 项目和列表是多对多的关系。 然后它将按距离或从低到高的价格进行分类。
$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');
}
这需要listing.latitude和listings.longitude保存在列表表格中。 错误是
SQLSTATE [42S22]:找不到列:1054未知列 ' listings.latitude'在'字段列表'
如果从低价到高价分类
未找到列:1054未知列' listings.id'在'组 语句'
如何访问/选择这两种排序的坐标和列表?
答案 0 :(得分:0)
您的Items是Item的集合而不是模型,因此您无法对此对象执行distance方法。您必须使用foreach并找到用户位置与每个项目之间的距离。
foreach($items as $item) {
$distance=$item->distance($userPosition);
}
现在,在distance
方法中,您将计算用户位置与项目之间的距离。
其次将$items->groupBy('listings.id')
更改为$items->groupBy('listing_id')
,其中listing_id
是items
表中的字段
答案 1 :(得分: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);