1
0
mirror of https://github.com/flarum/core.git synced 2025-08-06 16:36:47 +02:00

Keep tag discussions_count up-to-date

This commit is contained in:
Toby Zerner
2015-06-19 08:18:27 +09:30
parent 9c047485f0
commit d656d0ddb5
3 changed files with 50 additions and 7 deletions

View File

@@ -0,0 +1,49 @@
<?php namespace Flarum\Tags\Handlers;
use Flarum\Tags\Tag;
use Flarum\Tags\Events\DiscussionWasTagged;
use Flarum\Core\Events\DiscussionWasStarted;
use Flarum\Core\Events\DiscussionWasDeleted;
use Flarum\Core\Models\Discussion;
class TagMetadataUpdater
{
public function subscribe($events)
{
$events->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)]);
}
}

View File

@@ -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([]);
}
}

View File

@@ -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'),