Laravel中如何通过分类名称关联外键ID插入数据
解决方案
方法一:前端传递分类ID至创建接口
- 前端调用
getIdOfCategoryByName接口获取分类ID后,将该ID与其他表单字段(如title、description等)一起作为请求参数,发送到createcase接口。 - 修正后端
createcase方法的参数注入问题,并完善字段映射:
public function createcase(Request $request){ $request->validate([ 'title' => 'required', 'description' => 'required', 'caseTypeId' => 'required|exists:case_type,id', // 验证ID有效且存在于case_type表 'amountreceived' => 'required', 'amoutneeded' =>'required', 'uid' => 'required', 'visible' => 'required', 'image' => 'required', 'cityId' => 'required' ]); // 将前端传递的caseTypeId映射为case表对应的case_type_id字段 $data = $request->post(); $data['case_type_id'] = $data['caseTypeId']; unset($data['caseTypeId']); waitingdonations::create($data); return response()->json([ 'message' => 'waiting donation successfull', ]); }
同时修正getIdOfCategoryByName方法,确保返回单个ID而非集合:
public function getIdOfCategoryByName(Request $request){ $name = $request->input('name'); // 直接获取匹配的分类ID,无匹配则返回null $categoryId = case_type::where('category', $name)->value('id'); return response()->json(['caseTypeId' => $categoryId]); }
方法二:后端直接处理分类名称转ID(更简洁)
无需单独调用getIdOfCategoryByName接口,前端直接传递分类名称到createcase,后端内部完成ID查询:
- 修改
createcase的验证规则与逻辑:
public function createcase(Request $request){ $request->validate([ 'title' => 'required', 'description' => 'required', 'categoryName' => 'required|exists:case_type,category', // 验证分类名称存在 'amountreceived' => 'required', 'amoutneeded' =>'required', 'uid' => 'required', 'visible' => 'required', 'image' => 'required', 'cityId' => 'required' ]); // 根据名称查询分类ID $categoryId = case_type::where('category', $request->categoryName)->value('id'); // 组装插入数据,移除冗余的分类名称字段 $data = $request->except('categoryName'); $data['case_type_id'] = $categoryId; waitingdonations::create($data); return response()->json([ 'message' => 'waiting donation successfull', ]); }
- 前端只需将用户选择的分类名称作为
categoryName字段,与其他表单数据一起提交即可。
关键注意点
- 无论哪种方法,都要添加存在性验证(
exists规则),避免插入无效的分类ID或名称。 - 使用
value('id')替代get('id'):前者直接返回单个ID值,后者返回包含ID的集合,会导致插入失败。 - 确保
waitingdonations模型的$fillable属性包含case_type_id字段,否则create方法无法完成批量赋值。
内容的提问来源于stack exchange,提问作者aliana
相关产品推荐
相关产品推荐

