query('tag'); $query = Article::published()->orderByDesc('published_at'); if ($tagSlug) { $query->whereHas('tags', function ($tagQuery) use ($tagSlug) { $tagQuery->where('slug', $tagSlug); }); } $articles = $query->paginate($perPage); return view('frontend.article.index', [ 'articles' => $articles, 'tagSlug' => $tagSlug, ]); } public function show(string $slug, Request $request) { $article = Article::with('tags')->where('slug', $slug)->firstOrFail(); $this->recordView($article, $request); $comments = $article->comments() ->where('status', 'approved') ->orderByDesc('created_at') ->get(); $relatedArticles = Article::published() ->where('id', '!=', $article->id) ->whereHas('tags', function ($query) use ($article) { $query->whereIn('tags.id', $article->tags->pluck('id')); }) ->orderByDesc('published_at') ->limit(6) ->get(); return view('frontend.article.show', [ 'article' => $article, 'comments' => $comments, 'relatedArticles' => $relatedArticles, ]); } private function recordView(Article $article, Request $request): void { $ip = $request->ip() ?? '0.0.0.0'; $userAgent = $request->userAgent() ?? 'unknown'; $userAgentHash = sha1($userAgent); $log = ContentViewLog::firstOrCreate([ 'content_type' => 'article', 'content_id' => $article->id, 'ip' => $ip, 'user_agent_hash' => $userAgentHash, 'viewed_on' => now()->toDateString(), ]); if ($log->wasRecentlyCreated) { $article->increment('view_count'); } } }