aboutsummaryrefslogtreecommitdiff
path: root/lib/models/Forum/ForumTopic.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/models/Forum/ForumTopic.php')
-rw-r--r--lib/models/Forum/ForumTopic.php44
1 files changed, 24 insertions, 20 deletions
diff --git a/lib/models/Forum/ForumTopic.php b/lib/models/Forum/ForumTopic.php
index accae17..4d7bf69 100644
--- a/lib/models/Forum/ForumTopic.php
+++ b/lib/models/Forum/ForumTopic.php
@@ -36,6 +36,7 @@ class ForumTopic extends SimpleORMap
$config['has_many']['discussions'] = [
'class_name' => ForumDiscussion::class,
'foreign_key' => 'topic_id',
+ 'assoc_func' => 'getDiscussions',
'assoc_foreign_key' => 'topic_id',
];
@@ -46,6 +47,9 @@ class ForumTopic extends SimpleORMap
parent::configure($config);
}
+ /**
+ * @return self[]
+ */
public static function getCourseTopics($course_id): array
{
return self::findBySQL(
@@ -85,18 +89,27 @@ class ForumTopic extends SimpleORMap
return array_values($unique_users);
}
- public function getMetaData(): array
+ /**
+ * @return ForumDiscussion[]
+ */
+ public function getDiscussions(): array
{
- $user_id = User::findCurrent()->user_id;
- $object_user_visit = \ObjectUserVisit::findOneBySQL(
- "object_id = :object_id AND plugin_id = :plugin_id AND user_id = :user_id",
- [
- 'object_id' => $this->range_id,
- 'plugin_id' => \PluginEngine::getPlugin(\CoreForum::class)->getPluginId(),
- 'user_id' => $user_id,
- ]
+ return DBManager::get()->fetchAll(
+ "SELECT
+ discussions.*,
+ MAX(postings.mkdate) AS latest_post_date
+ FROM forum_discussions AS discussions
+ JOIN forum_postings as postings USING (discussion_id)
+ WHERE discussions.topic_id = :topic_id
+ GROUP BY discussions.discussion_id
+ ORDER BY discussions.sticky DESC, latest_post_date DESC",
+ ['topic_id' => $this->topic_id],
+ ForumDiscussion::buildExisting(...)
);
+ }
+ public function getMetaData(): array
+ {
return DBManager::get()->fetchOne(
"SELECT
COUNT(DISTINCT `forum_discussions`.`discussion_id`) AS 'discussions_count',
@@ -111,22 +124,13 @@ class ForumTopic extends SimpleORMap
ON fpr.discussion_id = fd2.discussion_id
AND fpr.user_id = :user_id
WHERE fd2.topic_id = :topic_id
- ) AS 'user_read_index',
- (
- SELECT
- COUNT(DISTINCT fp.posting_id)
- FROM forum_topics ft
- JOIN forum_discussions fd USING(topic_id)
- JOIN forum_postings fp ON fp.discussion_id = fd.discussion_id AND fp.mkdate > :last_visit
- WHERE ft.topic_id = :topic_id
- ) AS 'recent_postings_count'
+ ) AS 'user_read_index'
FROM `forum_discussions`
LEFT JOIN `forum_postings` USING (`discussion_id`)
WHERE `forum_discussions`.`topic_id` = :topic_id",
[
'topic_id' => $this->topic_id,
- 'user_id' => $user_id,
- 'last_visit' => $object_user_visit->last_visitdate ?? 0
+ 'user_id' => User::findCurrent()->user_id
]
);
}