Laravel基于门店地理位置搜索附近商品时调用products关联报错如何解决
问题原因
报错本质是调用关联方法的时机错误:products()是定义在Shop模型类上的关联方法,只能通过Shop模型实例调用。你在orderBy()之后还没有执行查询,此时对象还是查询构造器Illuminate\Database\Eloquent\Builder实例,自然找不到对应方法。
解决方法
根据你最终想要拿到的返回数据结构,可选择以下两种方案:
方案1:直接获取符合条件的商品列表
适合需要以商品为主体输出的场景,需要先在Product模型中定义好反向关联shop():
$products = Product::whereHas('shop', function ($query) use ($latitude, $longitude, $radius) { $query->selectRaw("( 6371 * acos( cos( radians(?) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance", [$latitude, $longitude, $latitude]) ->having('distance', '<', $radius); })->where('name', 'LIKE', '%' . $keyword . '%')->get();
方案2:获取按距离排序的门店+对应匹配商品
适合需要按门店距离分组展示商品的场景,用预加载关联的方式过滤商品:
$shops = Shop::selectRaw("id, ( 6371 * acos( cos( radians(?) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance", [$latitude, $longitude, $latitude]) ->having('distance', '<', $radius) ->orderBy('distance', 'asc') ->with(['products' => function ($query) use ($keyword) { $query->where('name', 'LIKE', '%' . $keyword . '%'); }]) ->get();
执行后遍历$shops即可拿到每个门店下匹配关键词的商品。
内容的提问来源于stack exchange,提问作者Wasim Rasheed
相关产品推荐
相关产品推荐

