get('per_page', 12), 50); $query = Post::query() ->published() ->with('category') ->whereHas('category', fn ($q) => $q->where('status', 'active')) ->when( $request->filled('keyword'), fn ($q) => $q->where(function ($subQuery) use ($request) { $keyword = $request->string('keyword')->toString(); $subQuery ->where('title', 'like', "%{$keyword}%") ->orWhere('excerpt', 'like', "%{$keyword}%") ->orWhere('content', 'like', "%{$keyword}%"); }) ) ->when( $request->filled('category_slug'), fn ($q) => $q->whereHas('category', fn ($subQuery) => $subQuery->where('slug', $request->string('category_slug')->toString())) ) ->orderByDesc('is_featured') ->orderByDesc('published_at') ->orderByDesc('id'); $paginator = $query->paginate($perPage); return response()->json([ 'error' => false, 'data' => [ 'items' => PostResource::collection($paginator->items()), 'total' => $paginator->total(), 'per_page' => $paginator->perPage(), 'current_page' => $paginator->currentPage(), 'last_page' => $paginator->lastPage(), ], ]); } public function featured(): JsonResponse { $posts = Post::query() ->published() ->with('category') ->where('is_featured', true) ->whereHas('category', fn ($q) => $q->where('status', 'active')) ->orderByDesc('published_at') ->limit(6) ->get(); return response()->json([ 'error' => false, 'data' => PostResource::collection($posts), ]); } public function show(string $slug): JsonResponse { $post = Post::query() ->published() ->with('category') ->where('slug', $slug) ->whereHas('category', fn ($q) => $q->where('status', 'active')) ->first(); if (!$post) { return response()->json(['error' => true, 'message' => 'Không tìm thấy bài viết.'], 404); } $post->increment('view_count'); $post->refresh(); $post->setRelation('related_posts', Post::query() ->published() ->with('category') ->where('post_category_id', $post->post_category_id) ->where('id', '!=', $post->id) ->orderByDesc('published_at') ->limit(4) ->get()); return response()->json([ 'error' => false, 'data' => new PostResource($post), ]); } }