From fa45db3c452e4e32b3f0359e514df036f48acb29 Mon Sep 17 00:00:00 2001 From: Ian Morland <16573496+imorland@users.noreply.github.com> Date: Wed, 9 Mar 2022 20:41:04 +0000 Subject: [PATCH] fix: unread filter gambit does not return results when > 999 read discussions for a user (#3295) --- .../src/Discussion/DiscussionRepository.php | 17 +++++++++++++++-- .../src/Discussion/Query/UnreadFilterGambit.php | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/framework/core/src/Discussion/DiscussionRepository.php b/framework/core/src/Discussion/DiscussionRepository.php index 68d053a86..a50ec5537 100644 --- a/framework/core/src/Discussion/DiscussionRepository.php +++ b/framework/core/src/Discussion/DiscussionRepository.php @@ -42,16 +42,29 @@ class DiscussionRepository /** * Get the IDs of discussions which a user has read completely. * + * @deprecated 1.3 Use `getReadIdsQuery` instead + * * @param User $user * @return array */ public function getReadIds(User $user) + { + return $this->getReadIdsQuery($user) + ->all(); + } + + /** + * Get a query containing the IDs of discussions which a user has read completely. + * + * @param User $user + * @return Builder + */ + public function getReadIdsQuery(User $user): Builder { return Discussion::leftJoin('discussion_user', 'discussion_user.discussion_id', '=', 'discussions.id') ->where('discussion_user.user_id', $user->id) ->whereColumn('last_read_post_number', '>=', 'last_post_number') - ->pluck('id') - ->all(); + ->select('id'); } /** diff --git a/framework/core/src/Discussion/Query/UnreadFilterGambit.php b/framework/core/src/Discussion/Query/UnreadFilterGambit.php index 44bd7c264..b995b2c74 100644 --- a/framework/core/src/Discussion/Query/UnreadFilterGambit.php +++ b/framework/core/src/Discussion/Query/UnreadFilterGambit.php @@ -61,7 +61,7 @@ class UnreadFilterGambit extends AbstractRegexGambit implements FilterInterface protected function constrain(Builder $query, User $actor, bool $negate) { if ($actor->exists) { - $readIds = $this->discussions->getReadIds($actor); + $readIds = $this->discussions->getReadIdsQuery($actor); $query->where(function ($query) use ($readIds, $negate, $actor) { if (! $negate) {