<?php use mystic\forum\orm\Attachment; use mystic\forum\orm\Post; use mystic\forum\orm\Topic; use mystic\forum\orm\User; use mystic\forum\utils\RequestUtils; $query = $_GET["query"] ?? null; if ($query !== null) { $start_time = microtime(true); /** @var Post[] $posts */ $posts = $db->execCustomQuery(<<<SQL SELECT posts.* FROM topics, posts WHERE NOT posts.deleted AND to_tsvector('english', topics.title || ' ' || posts.content) @@ websearch_to_tsquery('english', $1) ORDER BY posts.post_date DESC ; SQL, [ $query ], Post::class); $topicLookup = []; $attachmentLookup = []; $userLookup = []; foreach ($posts as $item) { if (!isset($topicLookup[$item->topicId])) { $topic = new Topic; $topic->id = $item->topicId; if ($db->fetch($topic)) $topicLookup[$topic->id] = $topic; } if (!isset($attachmentLookup[$item->id])) { $attachmentLookup[$item->id] = $db->fetchCustom(Attachment::class, 'WHERE post_id = $1', [ $item->id ]); } if (!isset($userLookup[$item->authorId])) { $user = new User; $user->id = $item->authorId; if ($db->fetch($user)) $userLookup[$item->authorId] = $user; } } $end_time = microtime(true); $search_duration = $end_time - $start_time; render("search.twig", [ "posts" => &$posts, "topics" => &$topicLookup, "users" => &$userLookup, "attachments" => &$attachmentLookup, "search_duration" => $search_duration, ]); } else { render("search.twig"); }