input('q', ''); $lat = $request->input('lat'); $lng = $request->input('lng'); $limit = min((int) $request->input('limit', 20), 50); $query = DB::connection('primary')->table('palces11'); if (!empty($q)) { // Fulltext search (palces11 has FULLTEXT index) $query->whereRaw( "MATCH(name, name_ar, name_en, address, category) AGAINST(? IN BOOLEAN MODE)", [$q . '*'] ); } // If coordinates provided, sort by distance if ($lat && $lng) { $query->selectRaw("*, ST_Distance_Sphere( POINT(CAST(longitude AS DECIMAL(10,7)), CAST(latitude AS DECIMAL(10,7))), POINT(?, ?) ) AS distance_meters", [(float)$lng, (float)$lat]) ->orderBy('distance_meters'); } $places = $query->limit($limit)->get(); return response()->json(['status' => 'success', 'data' => $places]); } /** POST /v2/places */ public function store(Request $request): JsonResponse { $request->validate([ 'latitude' => 'required|numeric', 'longitude' => 'required|numeric', 'name' => 'required|string|max:180', 'category' => 'required|string|max:55', ]); DB::connection('primary')->table('palces11')->insert([ 'latitude' => $request->input('latitude'), 'longitude' => $request->input('longitude'), 'name' => $request->input('name'), 'name_ar' => $request->input('name_ar'), 'name_en' => $request->input('name_en'), 'address' => $request->input('address'), 'category' => $request->input('category'), 'created_at' => now(), ]); return response()->json(['status' => 'success'], 201); } }