【问题标题】:select coordinates at other tables选择其他表格的坐标
【发布时间】:2018-01-18 03:55:51
【问题描述】:

我想获取所有最近的项目,坐标保存在列表表中。 items和listing是多对多的关系。 然后它将按距离或从低到高的价格排序。

 $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' in 'group 声明'

如何访问/选择这两种类型的坐标和列表?

【问题讨论】:

  • group by 对我来说似乎不正确,因为并非选择中的所有字段在功能上都依赖于它的值。
  • 但我认为真正的问题是with 在后台使用了 2 个单独的查询,而不是一个带有连接的查询。

标签: mysql laravel laravel-5 eloquent eager-loading


【解决方案1】:

您的 Items 是 Item 的集合而不是模型,因此您不能在此对象上执行距离方法。您必须使用 foreach 并查找用户位置与每个项目之间的距离。

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

现在在distance 方法中,您将计算用户位置和物品之间的距离。

其次将$items->groupBy('listings.id') 更改为$items->groupBy('listing_id'),其中listing_iditems 表上的字段

【讨论】:

    【解决方案2】:

    您可以在这里使用 join 而不是预先加载。

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

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多