query('q', '')); $category = (int) $request->query('category', 0); $benefit = trim((string) $request->query('benefit', '')); $perPage = (int) $request->query('per_page', 12); if ($perPage < 6 || $perPage > 60) { $perPage = 12; } $query = YogaPose::query()->with('category') ->when($q !== '', function ($qb) use ($q) { $qb->where(function ($sub) use ($q) { $sub->where('english_name', 'like', "%{$q}%") ->orWhere('sanskrit_name', 'like', "%{$q}%") ->orWhere('sanskrit_name_adapted', 'like', "%{$q}%"); }); }) ->when($category > 0, fn ($qb) => $qb->where('category_id', $category)) ->when($benefit !== '', fn ($qb) => $qb->where('benefits', 'like', "%{$benefit}%")) ->orderBy('english_name'); $poses = $query->paginate($perPage)->withQueryString(); return response()->json([ 'data' => YogaPoseResource::collection($poses->items()), 'meta' => [ 'current_page' => $poses->currentPage(), 'last_page' => $poses->lastPage(), 'per_page' => $poses->perPage(), 'total' => $poses->total(), ], 'categories' => YogaCategory::orderBy('name')->get(['id', 'name']), ]); } public function show(YogaPose $pose): JsonResponse { $pose->load('category'); $benefits = (string) $pose->benefits; $tokens = collect(preg_split('/[^\p{L}]+/u', mb_strtolower($benefits))) ->filter(fn ($t) => $t !== null && $t !== '' && mb_strlen($t) >= 4) ->unique() ->take(8) ->values() ->all(); $similarPoses = YogaPose::query() ->with('category') ->where('id', '!=', $pose->id) ->where(function ($q) use ($pose, $tokens) { if ($pose->category_id) { $q->orWhere('category_id', $pose->category_id); } foreach ($tokens as $tk) { $q->orWhere('benefits', 'like', "%{$tk}%"); } }) ->orderBy('english_name') ->limit(9) ->get(); return response()->json([ 'pose' => new YogaPoseResource($pose), 'similar_poses' => YogaPoseResource::collection($similarPoses), ]); } }