0

我有PostTag模型

为了给帖子添加标签,我有:

public function addTag($tag) // $tag is string
{
    $slug = Str::slug($tag);

    $t = Tag::where("url", $slug)->first();

    if(!$this->in_array_field($slug, 'name', $this->tags))
    {
        if(!isset($t))
        {
            $t = new Tag;
            $t->name = $tag;
            $t->url = $slug;
            $t->count = 1;
        }
        else
        {
            $t->increment('count');
        }

        $this->tags()->save($t);
    }

    return $t->id;
}

添加所有标签后,我调用sync以删除不再存在的标签

$this->tags()->sync($tagsIds); // $this is Post model

一切正常,但如何减少分离标签count

是否有任何处理程序或我应该合并数组并比较,如果不在旧集合中 -attach并且increase,不在新集合中 -detach或者decrease完全以另一种方式。

4

1 回答 1

0

在我的个人博客中,我使用 sql 来获取计数(我的标签数量相对较少,因此开销较低 + 加上我缓存了结果):

// Get list of tags, ordered by popularity (number of times used)
return \DB::table('tags_articles')->select('name', 'url_name', 'tag_id', \DB::raw('count(`tag_id`) as `tag_count`'))
               ->join('tags', 'tags.id', '=', 'tags_articles.tag_id')
               ->groupBy('tag_id')
               ->orderBy('tag_count', 'DESC')
               ->take($limit)
               ->get();

或者,您可能希望运行单独的查询来更新与该进程分开的每个标记计数 - 在 cron 中或在sync()调用之后运行的新查询时。假设您的写入量很少(通常每秒不会多次标记项目),那么任何一种方式都可能不会导致太多的瓶颈。

最后,数据库更新后会触发“事件”。看看这些模型事件中的一些是否可用于在插入(“保存”)到您的 Tag 模型后更新计数。

于 2013-07-09T19:05:07.503 回答