*/ public function nearby(float $latitude, float $longitude, float $radiusKm = 5.0, int $limit = 25): Collection { $radiusMeters = $radiusKm * 1000; $rows = DB::table('partner_stores') ->whereNull('deleted_at') ->where('status', PartnerStore::STATUS_ACTIVE) ->whereNotNull('coordinates') ->select('id') ->selectRaw( 'ST_Distance_Sphere(coordinates, ST_SRID(POINT(?, ?), 4326)) AS distance_meters', [$longitude, $latitude], ) ->whereRaw( 'ST_Distance_Sphere(coordinates, ST_SRID(POINT(?, ?), 4326)) <= ?', [$longitude, $latitude, $radiusMeters], ) ->orderBy('distance_meters') ->limit($limit) ->get(); if ($rows->isEmpty()) { return collect(); } $distancesById = $rows->pluck('distance_meters', 'id'); $stores = PartnerStore::with(['barangay', 'inventory']) ->whereIn('id', $rows->pluck('id')) ->get() ->keyBy('id'); return $rows->map(function ($r) use ($stores, $distancesById) { $s = $stores->get($r->id); if ($s) { $s->distance_meters = (float) $distancesById->get($r->id); } return $s; })->filter()->values(); } }