validate(['type' => ['required', 'in:province,district,admin_post,locality'], 'id' => ['nullable', 'uuid'], 'parent_id' => ['nullable', 'uuid'], 'q' => ['nullable', 'string', 'max:100'], 'page' => ['nullable', 'integer', 'min:1']]); $query = $geography->publicReferences()->where('location_type', $data['type']); if (! empty($data['id'])) { $query->where('id', $data['id']); } if ($data['type'] !== 'province') { $parentType = ['district' => 'province', 'admin_post' => 'district', 'locality' => 'admin_post'][$data['type']]; $parent = $geography->publicReferences()->where('id', $data['parent_id'] ?? '00000000-0000-0000-0000-000000000000')->where('location_type', $parentType)->value('id'); $query->where('parent_id', $parent ?? '00000000-0000-0000-0000-000000000000'); } if (! empty($data['q'])) { $term = '%'.addcslashes(Str::ascii($data['q']), '%_\\').'%'; $query->where(fn ($q) => $q ->whereRaw("translate(lower(name), 'áàâãäåéèêëíìîïóòôõöúùûüçýÿ', 'aaaaaaeeeeiiiiooooouuuucyy') ILIKE ?", [$term]) ->orWhereRaw('code ILIKE ?', [$term]) ->orWhereRaw('source_code ILIKE ?', [$term])); } return response()->json($query->orderBy('name')->orderBy('id')->paginate(100, ['id', 'name', 'parent_id', 'location_type', 'source_code'])); } }