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:
49
extensions/tags/src/Handlers/TagMetadataUpdater.php
Executable file
49
extensions/tags/src/Handlers/TagMetadataUpdater.php
Executable 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)]);
|
||||
}
|
||||
}
|
@@ -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([]);
|
||||
}
|
||||
}
|
||||
|
@@ -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'),
|
||||
|
Reference in New Issue
Block a user