*/ class Post { /** * The format the comment categories should follow. */ private const COMMENT_CATEGORY_FORMAT = "news-%s-%u"; /** * The id of this news post. * @var int */ public $id = 0; /** * The category this post is part of. * @var int */ public $category = 0; /** * The user who made this post. * @var int */ public $user = 0; /** * The title of this news post. * @var string */ public $title = ""; /** * The content of this news post. * @var string */ public $text = ""; /** * When the post was created. * @var Carbon */ public $created = null; /** * When the post was last updated. * @var Carbon */ public $updated = null; /** * When the post was deleted. * @var Carbon */ public $deleted = null; /** * A cache of the amount of comments this post has. * @var int */ private $commentCountCache = 0; /** * A cache of comments. * @var array */ private $commentsCache = []; /** * Constructor. * @param int $id */ public function __construct(int $id = 0) { $data = DB::table('news_posts') ->where('post_id', $id) ->first(); if ($data) { $this->id = intval($data->post_id); $this->category = intval($data->category_id); $this->user = intval($data->user_id); $this->title = $data->post_title; $this->text = $data->post_text; $this->created = new Carbon($data->created_at); $this->updated = new Carbon($data->updated_at); $this->deleted = new Carbon($data->deleted_at); } } /** * Saving changes to this news post. */ public function save(): void { // // Create submission data, insert and update take the same format // $data = [ // 'news_category' => $this->category, // 'user_id' => $this->user, // 'news_timestamp' => $this->time, // 'news_title' => $this->title, // 'news_content' => $this->text, // ]; // // Update if id isn't 0 // if ($this->id) { // DB::table('news') // ->where('news_id', $this->id) // ->update($data); // } else { // $this->id = DB::table('news') // ->insertGetId($data); // } } /** * Deleting this news post. */ public function delete(): void { // DB::table('news') // ->where('news_id', $this->id) // ->delete(); // $this->id = 0; } /** * Get the user object of the poster. * @return User */ public function userData(): User { return User::construct($this->user); } /** * Count the amount of comments this post has. * @return int */ public function commentCount(): int { if (!$this->commentCountCache) { $this->commentCountCache = DB::table('comments') ->where('comment_category', sprintf(self::COMMENT_CATEGORY_FORMAT, $this->category, $this->id)) ->count(); } return $this->commentCountCache; } /** * Get the comments on this post. * @return array */ public function comments(): array { if (!$this->commentsCache) { $commentIds = DB::table('comments') ->where('comment_category', sprintf(self::COMMENT_CATEGORY_FORMAT, $this->category, $this->id)) ->orderBy('comment_id', 'desc') ->where('comment_reply_to', 0) ->get(['comment_id']); $commentIds = array_column($commentIds, 'comment_id'); foreach ($commentIds as $comment) { $this->commentsCache[$comment] = new Comment($comment); } } return $this->commentsCache; } }