使用商店地理定位的产品搜索

Product Search using geolocation of shops

我是 Laravel 的新手,我正在尝试使用附近的商店搜索产品 这是我的代码

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')->products()->where('name', 'LIKE', '%' . $keyword . '%')->get();

但我收到此错误消息:

"message": "Call to undefined method Illuminate\Database\Eloquent\Builder::products()"

注意:商店和产品之间的关系在我的其他功能中起作用

我真的很困惑,为什么在 orderBy 和所有其他子句之后使用 products()

如果你想从商店获取 products,你不必做 products(),你必须使用 Product::....,但如果你想获取相关的商店要 products,您必须使用 whereHas('products', ....),阅读更多相关信息 here

你的代码应该是这样的:

$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')
    ->whereHas('products', function ($query) use ($keyword) {
        return $query->where('name', 'LIKE', '%' . $keyword . '%');
    })
    ->with('products')
    ->get();

该代码会给你商店,你可以做$shops->products

但是如果你想直接得到products你必须使用Product模型:

$products = Product::where('name', 'LIKE', '%' . $keyword . '%')
    ->whereHas('shops', function ($query) use ($latitude, $longitude, $latitude, $radius) {
        return $query->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');
    })
    ->get();