get('search'); $meetups = Meetup::query() ->select('id', 'name', 'city_id', 'slug') ->with(['city:id,name,country_id', 'city.country:id,name']) ->orderBy('name') ->when( is_string($search) && $search !== '', function (Builder $query) use ($search): void { $needle = '%'.mb_strtolower(trim((string) $search)).'%'; $query->where(function (Builder $inner) use ($needle): void { $inner->whereRaw('LOWER(name) LIKE ?', [$needle]) ->orWhereHas('city', fn (Builder $city) => $city->whereRaw('LOWER(cities.name) LIKE ?', [$needle])); }); } ) ->limit(10) ->get() ->map(fn (Meetup $meetup): array => [ 'id' => $meetup->id, 'name' => $meetup->name, 'city' => $meetup->city?->name, 'country' => $meetup->city?->country?->name, ]); return Response::json($meetups->values()); } /** * @return array */ public function schema(JsonSchema $schema): array { return [ 'search' => $schema->string()->description('Suchbegriff: Meetup-Name oder Stadtname (z. B. "München").'), ]; } }