fetchCustom(Post::class, 'WHERE topic_id = $1 ORDER BY post_date', [ $topicId ]); /** @var TopicLogMessage[] $logMessages */ $logMessages = $db->fetchCustom(TopicLogMessage::class, 'WHERE topic_id = $1 ORDER BY post_date', [ $topicId ]); $userCache = []; $topicAuthor = null; if ($topic->createdBy !== null) { $topicAuthor = new User(); $topicAuthor->id = $topic->createdBy; if (!$db->fetch($topicAuthor)) { $topicAuthor = null; } } $allItems = [...$posts, ...$logMessages]; usort($allItems, fn(Post|TopicLogMessage $a, Post|TopicLogMessage $b): int => $a->postDate <=> $b->postDate); $allItems = array_map(function(Post|TopicLogMessage $item) use (&$db, &$topicAuthor, &$topic): array { /** @var ?User $postAuthor */ $postAuthor = null; if ($item->authorId !== null && !isset($userCache[$item->authorId])) { $usr = new User(); $usr->id = $item->authorId; if ($db->fetch($usr)) $userCache[$item->authorId] = &$usr; } if (isset($userCache[$item->authorId])) $postAuthor = &$userCache[$item->authorId]; if ($item instanceof Post) { $attachments = $db->fetchCustom(Attachment::class, 'WHERE post_id = $1', [ $item->id ]); return [ "type" => "post", "post" => $item, "postAuthor" => $postAuthor, "topicAuthor" => $topicAuthor, "attachments" => $attachments, "topic" => $topic, ]; } else { return [ "type" => "logMessage", "logMessage" => $item, "postAuthor" => $postAuthor, "topicAuthor" => $topicAuthor, "topic" => $topic, ]; } }, $allItems); render("view_topic.twig", [ "topic" => $topic, "topicAuthor" => $topicAuthor, "allItems" => &$allItems, ]);