创建文章时如何同时向Tags与post_tag表插入标签关联数据?
问题解决方法
错误原因
- 你的代码已经正确把标签名转成对应的标签ID存到了
$tagNames数组里,但调用关联同步方法sync()的时候错误传入了原始请求里的标签字符串$request->tags,post_tag表的tag_id字段要求是整数类型,直接传入字符串就触发了类型不匹配报错 - 标签处理逻辑里
$tags = explode(",", implode($request->tags));的写法冗余,如果前端传入的是逗号分隔的标签字符串,直接explode(',', $request->tags)即可,不需要调用implode
修正方案
只需要修改你代码里sync方法的传入参数即可,下面是完整修正后的标签处理部分代码:
if($post){ // 优化标签拆分逻辑,直接拆分请求中的标签字符串 $tags = explode(",", $request->tags); $tagNames = []; if (!empty($tags)) { foreach ($tags as $tagName) { // 去除标签名前后多余空格,避免重复创建内容相同但带空格的标签 $tagName = trim($tagName); $tag = Tags::firstOrCreate(['name'=>$tagName]); if($tag) { $tagNames[] = $tag->id; } } } // 这里改为传入标签ID数组$tagNames,不要用原始的$request->tags $post->tags()->sync($tagNames); $notification = array( 'message' => 'Post Inserted Successfully', 'alert-type' => 'success' ); return redirect()->route('all.posts')->with($notification); }else{ return back(); }
额外优化建议
可以在请求验证里加上tags的必填规则,避免空标签提交的问题:
$request->validate([ 'post_title' => 'required', 'post_details' => 'required', 'category_id' => 'required', 'tags' => 'required|string', 'image' => 'image|max:15360|dimensions:max_width=4000,max_height=3000' ]);
内容的提问来源于stack exchange,提问作者MicroWeb Technology Ltd
相关产品推荐
相关产品推荐

