/** * @param \Flarum\Core\Notification[] $notifications */ private function loadSubjectDiscussions(array $notifications) { $ids = []; foreach ($notifications as $notification) { if ($notification->subject && $notification->subject->discussion_id) { $ids[] = $notification->subject->discussion_id; } } $discussions = Discussion::find(array_unique($ids)); foreach ($notifications as $notification) { if ($notification->subject && $notification->subject->discussion_id) { $notification->subject->setRelation('discussion', $discussions->find($notification->subject->discussion_id)); } } }
/** * Get the position within a discussion where a post with a certain number * is. If the post with that number does not exist, the index of the * closest post to it will be returned. * * @param int $discussionId * @param int $number * @param \Flarum\Core\User|null $actor * @return int */ public function getIndexForNumber($discussionId, $number, User $actor = null) { $query = Discussion::find($discussionId)->postsVisibleTo($actor)->where('time', '<', function ($query) use($discussionId, $number) { $query->select('time')->from('posts')->where('discussion_id', $discussionId)->whereNotNull('number')->take(1)->orderByRaw('ABS(CAST(number AS SIGNED) - ' . (int) $number . ')'); }); return $query->count(); }
/** * Refreshes count and last Post for the discussion. * * @param Discussion $discussion */ protected function refreshDiscussion(Discussion $discussion) { $discussion->refreshLastPost(); $discussion->refreshCommentsCount(); $discussion->refreshParticipantsCount(); // Persist the new statistics. $discussion->save(); return Discussion::find($discussion->id); }