diff --git a/extensions/tags/src/Handlers/TagMetadataUpdater.php b/extensions/tags/src/Handlers/TagMetadataUpdater.php new file mode 100755 index 000000000..cbc75fd49 --- /dev/null +++ b/extensions/tags/src/Handlers/TagMetadataUpdater.php @@ -0,0 +1,49 @@ +listen('Flarum\Core\Events\DiscussionWasStarted', __CLASS__.'@whenDiscussionWasStarted'); + $events->listen('Flarum\Tags\Events\DiscussionWasTagged', __CLASS__.'@whenDiscussionWasTagged'); + $events->listen('Flarum\Core\Events\DiscussionWasDeleted', __CLASS__.'@whenDiscussionWasDeleted'); + } + + public function whenDiscussionWasStarted(DiscussionWasStarted $event) + { + $tags = $event->discussion->tags(); + + $this->updateTagCounts($tags, 1); + } + + public function whenDiscussionWasTagged(DiscussionWasTagged $event) + { + $oldTags = Tag::whereIn('id', array_pluck($event->oldTags, 'id')); + + $this->updateTagCounts($oldTags, -1); + + $newTags = $event->discussion->tags(); + + $this->updateTagCounts($newTags, 1); + } + + public function whenDiscussionWasDeleted(DiscussionWasDeleted $event) + { + $tags = $event->discussion->tags(); + + $this->updateTagCounts($tags, -1); + + $tags->detach(); + } + + protected function updateTagCounts($query, $delta) + { + $query->update(['discussions_count' => app('db')->raw('discussions_count + '.$delta)]); + } +} diff --git a/extensions/tags/src/Handlers/TagSaver.php b/extensions/tags/src/Handlers/TagSaver.php index 739318e6c..c20c76afa 100755 --- a/extensions/tags/src/Handlers/TagSaver.php +++ b/extensions/tags/src/Handlers/TagSaver.php @@ -3,7 +3,6 @@ use Flarum\Tags\Tag; use Flarum\Tags\Events\DiscussionWasTagged; use Flarum\Core\Events\DiscussionWillBeSaved; -use Flarum\Core\Events\DiscussionWasDeleted; use Flarum\Core\Models\Discussion; use Flarum\Core\Exceptions\PermissionDeniedException; @@ -12,7 +11,6 @@ class TagSaver public function subscribe($events) { $events->listen('Flarum\Core\Events\DiscussionWillBeSaved', __CLASS__.'@whenDiscussionWillBeSaved'); - $events->listen('Flarum\Core\Events\DiscussionWasDeleted', __CLASS__.'@whenDiscussionWasDeleted'); } public function whenDiscussionWillBeSaved(DiscussionWillBeSaved $event) @@ -57,9 +55,4 @@ class TagSaver } } } - - public function whenDiscussionWasDeleted(DiscussionWasDeleted $event) - { - $event->discussion->tags()->sync([]); - } } diff --git a/extensions/tags/src/TagsServiceProvider.php b/extensions/tags/src/TagsServiceProvider.php index a1688999e..78098c977 100644 --- a/extensions/tags/src/TagsServiceProvider.php +++ b/extensions/tags/src/TagsServiceProvider.php @@ -124,6 +124,7 @@ class TagsServiceProvider extends ServiceProvider // Add an event subscriber so that tags data is persisted when // saving a discussion. new Extend\EventSubscriber('Flarum\Tags\Handlers\TagSaver'), + new Extend\EventSubscriber('Flarum\Tags\Handlers\TagMetadataUpdater'), // Add a gambit that allows filtering discussions by tag(s). new Extend\DiscussionGambit('Flarum\Tags\TagGambit'),