context = DatabaseConnection::i()->getContext(); $this->topics = $this->context->table("topics"); } private function toTopic(?ActiveRow $ar): ?Topic { return is_null($ar) ? NULL : new Topic($ar); } function get(int $id): ?Topic { return $this->toTopic($this->topics->get($id)); } function getTopicById(int $club, int $topic): ?Topic { return $this->toTopic($this->topics->where(["group" => $club, "virtual_id" => $topic, "deleted" => 0])->fetch()); } function getClubTopics(Club $club, int $page = 1, ?int $perPage = NULL): \Traversable { $perPage = $perPage ?? OPENVK_DEFAULT_PER_PAGE; // Get pinned topics first $query = "SELECT `id` FROM `topics` WHERE `pinned` = 1 AND `group` = ? AND `deleted` = 0 UNION SELECT `id` FROM `topics` WHERE `pinned` = 0 AND `group` = ? AND `deleted` = 0"; $query .= " LIMIT " . $perPage . " OFFSET " . ($page - 1) * $perPage; foreach(DatabaseConnection::i()->getConnection()->query($query, $club->getId(), $club->getId()) as $topic) { $topic = $this->get($topic->id); if(!$topic) continue; yield $topic; } } function getClubTopicsCount(Club $club): int { return sizeof($this->topics->where([ "group" => $club->getId(), "deleted" => false ])); } function find(Club $club, string $query): \Traversable { return new Util\EntityStream("Topic", $this->topics->where("title LIKE ? AND group = ? AND deleted = 0", "%$query%", $club->getId())); } function getLastTopics(Club $club, ?int $count = NULL): \Traversable { $topics = $this->topics->where([ "group" => $club->getId(), "deleted" => false ])->page(1, $count ?? OPENVK_DEFAULT_PER_PAGE)->order("created DESC"); foreach($topics as $topic) yield $this->toTopic($topic); } }