getMemes($request->input('search')); } public function search(string $search): Response { // Convert + back to spaces for search $searchTerm = str_replace('+', ' ', $search); return $this->getMemes($searchTerm); } private function getMemes(?string $search = null): Response { $query = MemeMedia::query() ->where('is_enabled', true) ->orderBy('id', 'desc'); // Search functionality if ($search) { $query->where(function ($q) use ($search) { $q->where('name', 'ilike', "%{$search}%") ->orWhere('description', 'ilike', "%{$search}%") ->orWhereJsonContains('keywords', $search) ->orWhereJsonContains('action_keywords', $search) ->orWhereJsonContains('emotion_keywords', $search) ->orWhereJsonContains('misc_keywords', $search); }); } $memes = $query->cursorPaginate(24); // Get available types for filter $types = MemeMedia::where('is_enabled', true) ->distinct() ->pluck('type') ->filter(); // Get popular keywords for filter $popularKeywords = MemeMedia::where('is_enabled', true) ->get() ->pluck('keywords') ->flatten() ->countBy() ->sort() ->reverse() ->take(20) ->keys(); return Inertia::render('memes/index', [ 'memes' => $memes, 'types' => $types, 'popularKeywords' => $popularKeywords, 'filters' => [ 'search' => $search, ], ]); } public function show(string $slug): Response { $meme = MemeMedia::where('slug', $slug) ->where('is_enabled', true) ->firstOrFail(); // Get related memes based on similar keywords $relatedMemes = MemeMedia::where('is_enabled', true) ->where('id', '!=', $meme->id) ->where(function ($query) use ($meme) { if ($meme->keywords) { foreach ($meme->keywords as $keyword) { $query->orWhereJsonContains('keywords', $keyword) ->orWhereJsonContains('action_keywords', $keyword) ->orWhereJsonContains('emotion_keywords', $keyword) ->orWhereJsonContains('misc_keywords', $keyword); } } }) ->limit(6) ->get(); return Inertia::render('memes/show', [ 'meme' => $meme, 'relatedMemes' => $relatedMemes, ]); } }