0

私はモデルを持っPostていますTag

投稿にタグを追加するために私は持っています:

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?

ハンドラーはありますか、それとも配列をマージして、古いセットにない場合、新しいセットにない場合、または完全に別の方法で比較する必要attachincreaseあり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()呼び出された後に実行される新しいクエリとして。書き込みの量が少ないと仮定すると (1 秒間に何度もアイテムにタグ付けすることはあまりありません)、どちらの方法でもボトルネックはあまり発生しません。

最後に、データベースの更新後に発生する「イベント」があります。これらのモデル イベントのいくつかを使用して、Tag モデルへの挿入 (「保存」) 後にカウントを更新できるかどうかを確認してください。

于 2013-07-09T19:05:07.503 に答える