我尝试在laravel中添加标签。这是更新代码:
findNextParens :: Int -> String -> Int
findNextParens 1 (')':str) = 1
findnextParens n (c:str) = 1 + findNextParens n str
findNextParens n ('(':str) = 1 + findNextParens (n + 1) str
findNextParens n (')':str) = 1 + findNextParens (n - 1) str
它适用于数据透视表,这已经解决了。
我的问题在于标签表。当我删除所有标签并重新键入新标签或存在标签时,确定无效。
但是当我不更改或保留旧标签并继续添加新标签时会导致逻辑错误。它会自动将记录添加到标签表中。 例如:我的帖子有3个标签:test1,test2,test3。我保留它并添加一个标签:test4然后在表标签中自动添加标签:test2,test3,test4。
我的问题有解决方案吗?我哪里错了?我花了将近2天的时间。我不想用包。投票给答案有用。
答案 0 :(得分:0)
首先,使用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();
}
这意味着当您传递新标记时,它会删除帖子中的所有相关标记。如果您只传递旧标签,则不会删除它们。
答案 1 :(得分:0)
这是我的观点:
<input class="tagsinput" data-role="tagsinput" name="tags" value="
@foreach ($post->tags as $tag)
{{ $tag->name }},
@endforeach">
我预先处理数据旧标记,因此当我不更改该匹配时,它会向表中添加标记。