【问题标题】:Logic error when add tag for post in Laravel在 Laravel 中为帖子添加标签时出现逻辑错误
【发布时间】:2018-01-27 20:28:05
【问题描述】:

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

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');
}

它与数据透视表配合得很好,这个问题已经解决了。

我的问题在于标签表。当我删除所有标签并重新输入新标签或现有标签时,就可以了。

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

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

【问题讨论】:

  • 是多对多吗?为什么要拆标签?无论如何它都会sync
  • 是的,这是多对多。我该怎么办?
  • 我很好奇我是否正确理解了这个错误。请描述一下,你的代码有什么问题?是标签表输入错误还是关系错误?

标签: laravel tagging


【解决方案1】:

首先使用firstOrCreate,简洁方便。然后,不要分离,它没用,sync 使连接标签就像数组 tagIds 一样,它从数据透视表中删除不存在的元素并添加新元素。

另外,你的逗号和单词之间有空格,所以你需要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();
}

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

【讨论】:

  • pivot post_tag 表有什么无关紧要,标签表有问题。
猜你喜欢
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2013-08-20
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多