You need to enable JavaScript to run this app. Laravel基于门店地理位置搜索附近商品时调用products关联报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 15:45:05