在 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 中删除所有相关标签。如果您只传递旧标签,则它们不会被删除。
我正在尝试在 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 中删除所有相关标签。如果您只传递旧标签,则它们不会被删除。