在 Laravel 中为 post 添加标签时出现逻辑错误

Logic error when add tag for post in Laravel

我正在尝试在 laravel 中为 post 添加标签。这是更新代码:

public function update(PostRequest $request, $id)
{
    $post = Post::find($id);

    $post->update($request->all());

    if ($request->tags) {
        $tagNames = explode(',', $request->tags);
        $tagIds = [];

        foreach ($tagNames as $tagName) {
            $tagCount = Tag::where('name', '=', $tagName)->count();
            if ($tagCount < 1) {
                $tag = $post->tags()->create(['name' => $tagName]);
            } else {
                $post->tags()->detach();
                $tag = Tag::where('name', $tagName)->first();
            }
            $tagIds[] = $tag->id;
        }
        $post->tags()->sync($tagIds);
    }

    return back()->with('success', 'Successfully');
}

它与 pivot table 配合得很好,这个问题已经解决了。

我的问题出在标签table上。当我删除所有标签并重新输入新标签或现有标签时,一切正常。

但是当我不更改或保留旧标签并继续添加新标签时会导致逻辑错误。它会自动将记录添加到标签 table。 例如:我的post有3个标签:test1、test2、test3。我保留它并添加一个标签:test4 然后在 table 标签中自动添加标签:test2, test3, test4.

我的问题有解决方案吗?我哪里错了?我花了将近 2 天的时间。我不想使用包。为有用的答案投票。

先用firstOrCreate,短小方便。然后,不要分离,它没用,sync 使连接标签就像数组 tagIds 一样,它从一个枢轴 table 中删除不存在的元素并添加新元素。

另外,逗号和单词之间有空格,所以你需要trim它。

if ($request->tags) {
    $tagNames = explode(',', $request->tags);
    $tagIds = [];

    foreach ($tagNames as $tagName) {
        $tag = Tag::firstOrCreate(['name' => trim($tagName)]);
        $tagIds[] = $tag->id;
    }
    $post->tags()->sync($tagIds);
}

我想我已经理解了你的错误,它就在这里

if ($tagCount < 1) {
    $tag = $post->tags()->create(['name' => $tagName]);
} else {
    $post->tags()->detach();
    $tag = Tag::where('name', $tagName)->first();
}

这意味着当你传递一个新标签时,它会从 post 中删除所有相关标签。如果您只传递旧标签,则它们不会被删除。