/** * Get all posts for a thread. * * @param Topic $topic The thread to fetch the posts for. * @param bool $withTrashed Find trashed posts? * * @return mixed */ public function allForTopic(Topic $topic, $withTrashed = false) { $postsPerPage = $this->settings->get('user.posts_per_page', 10); $baseQuery = $this->postModel->with(['author', 'likes'])->where('topic_id', '=', $topic->id); if ($withTrashed) { $baseQuery = $baseQuery->withTrashed(); } return $baseQuery->paginate($postsPerPage); }
/** * @param PermissionChecker $permissionChecker * @param SearchRequest $searchRequest * * @return \Illuminate\Http\RedirectResponse */ public function makeSearch(PermissionChecker $permissionChecker, SearchRequest $searchRequest) { if ($searchRequest->result != 'posts') { $searchRequest->result = 'topics'; } if ($searchRequest->result == 'topics') { $query = Topic::with(['firstPost']); $query->leftJoin('posts', 'topics.first_post_id', '=', 'posts.id'); $query->where(function ($query) use(&$searchRequest) { $query->where(function ($query) use(&$searchRequest) { $query->where('topics.title', 'like', '%' . $searchRequest->keyword . '%'); $query->orWhere('posts.content', 'like', '%' . $searchRequest->keyword . '%'); }); }); } else { $query = Post::with(['topic']); $query->leftJoin('topics', 'posts.topic_id', '=', 'topics.id'); $query->where('posts.content', 'like', '%' . $searchRequest->keyword . '%'); } if ($searchRequest->author) { $query->leftJoin('users', 'posts.user_id', '=', 'users.id'); $query->where(function ($query) use(&$searchRequest) { if ($searchRequest->matchusername) { $query->where('users.name', $searchRequest->author); $query->orWhere('posts.username', $searchRequest->author); } else { $query->where('users.name', 'like', '%' . $searchRequest->author . '%'); $query->orWhere('posts.username', 'like', '%' . $searchRequest->author . '%'); } }); } if ($searchRequest->topic_replies_type) { switch ($searchRequest->topic_replies_type) { case 'atmost': $query->where('topics.num_posts', '<=', $searchRequest->topic_replies); break; case 'atleast': $query->where('topics.num_posts', '>=', $searchRequest->topic_replies); break; case 'exactly': default: $query->where('topics.num_posts', $searchRequest->topic_replies); break; } } if ($searchRequest->post_date) { $postDateType = '>='; if ($searchRequest->post_date_type == 'older') { $postDateType = '<='; } switch ($searchRequest->post_date) { case 'yesterday': $postDate = '-1 day'; break; case 'oneweek': $postDate = '-1 week'; break; case 'twoweek': $postDate = '-2 weeks'; break; case 'onemonth': $postDate = '-1 month'; break; case 'threemonth': $postDate = '-3 months'; break; case 'sixmonth': $postDate = '-3 months'; break; case 'oneyear': $postDate = '-1 year'; break; default: $postDate = ''; break; } if ($postDate) { $query->where($searchRequest->result . '.created_at', $postDateType, new \DateTime('today ' . $postDate)); } } if (is_array($searchRequest->forums) && (!empty($searchRequest->forums) || !in_array('-1', $searchRequest->forums))) { $query->whereIn('topics.forum_id', $searchRequest->forums); } // Forum permissions need to be checked $unviewableForums = $permissionChecker->getUnviewableIdsForContent('forum'); if (!empty($unviewableForums)) { $query->whereNotIn('topics.forum_id', $unviewableForums); } if (!$searchRequest->sortby) { $searchRequest->sortby = 'postdate'; $searchRequest->sorttype = 'asc'; } if (!$searchRequest->sorttype) { $searchRequest->sorttype = 'asc'; } $topics = []; $posts = []; $results = $query->get(); if ($searchRequest->result == 'topics') { foreach ($results as $result) { $topics[] = $result->id; $posts[] = $result->firstPost->id; } } else { foreach ($results as $result) { $topics[] = $result->topic->id; $posts[] = $result->id; } } $searchlog = $this->searchRepository->create(['topics' => implode(',', $topics), 'posts' => implode(',', $posts), 'keywords' => $searchRequest->keyword, 'as_topics' => $searchRequest->result == 'topics']); return redirect()->route('search.results', ['id' => $searchlog->id, 'orderBy' => $searchRequest->sortby, 'orderDir' => $searchRequest->sorttype]); }