Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/Tag/Merger.php
<?php

namespace XF\Service\Tag;

use
XF\Entity\Tag;

class
Merger extends \XF\Service\AbstractService
{
   
/**
     * @var Tag
     */
   
protected $target;

    public function
__construct(\XF\App $app, Tag $target)
    {
       
parent::__construct($app);

       
$this->target = $target;
    }

    public function
getTarget()
    {
        return
$this->target;
    }

    public function
setTarget(Tag $tag)
    {
       
$this->target = $tag;
    }

    public function
merge(Tag $source)
    {
       
$db = $this->db();

       
$targetTagId = $this->target->tag_id;
       
$sourceTagId = $source->tag_id;

        if (
$targetTagId == $sourceTagId)
        {
            throw new \
InvalidArgumentException("May not merge a tag with itself");
        }

       
$db->beginTransaction();

       
$db->query("
            UPDATE IGNORE xf_tag_content
            SET tag_id = ?
            WHERE tag_id = ?
        "
, [$targetTagId, $sourceTagId]);

       
// this handles cases where the content already had the target tag
       
$db->query("DELETE FROM xf_tag_content WHERE tag_id = ?", $sourceTagId);

       
$db->query("DELETE FROM xf_tag_result_cache WHERE tag_id = ?", $targetTagId);

       
$source->delete();

       
/** @var \XF\Repository\Tag $tagRepo */
       
$tagRepo = $this->repository('XF:Tag');
       
$tagRepo->recalculateTagUsageCache($targetTagId);

       
$db->commit();

       
$this->app->jobManager()->enqueueUnique('tagUpdate' . $targetTagId, 'XF:TagRecache', [
           
'tagId' => $targetTagId
       
]);
    }
}