如何删除指定Module对象并按顺序重命名剩余Module
问题:删除指定模块对象并重新排序命名
现有模块对象
我获取到了如下模块对象,想要删除指定的模块(比如module_1),并将剩余的module_2、module_3……重新命名为module_1、module_2……,保持顺序递增。
{ "module_1": { "modulename": "maths", "moduletypes": "mandatory", "moduleid": "88", "moduleaim": "MODULE AIM", "learningobjectives": "LEARNING OBJECTIVES", "assessmentcriteria": "SSESSMENT CRITERIA", "scenario": "sfgsfgsdfg", "tasknumber": 2, "taskarea": [ "<p>taskarea1sdfgsdfsfgagagasdasdf</p>", "<p>asdasdasd</p>" ], "librarylinks": [ "asdasdsa", "asdasd" ], "studylinks": [ "asdasd", "asdasd" ], "videoslinks": [ "asdasdfsdfsdfsdfsdfsdfsdf", "asdasdfsfsdfsf" ] }, "module_2": { "modulename": "asasdasd", "moduletypes": "optional", "moduleid": "23443", "moduleaim": "asdasgdfg", "learningobjectives": "dgdg", "assessmentcriteria": "dfgdg", "scenario": "dgdgdg", "tasknumber": 1, "taskarea": [ "dgdfgdfg" ], "librarylinks": [ "dfgdfgdfg" ], "studylinks": [ "dgdfgdfg" ], "videoslinks": [ "dgdfgdfg", "sdfasdfasf" ] }, "module_3": { "modulename": "science", "moduletypes": "optional", "moduleid": "3234", "moduleaim": "sadfsdfgsdaf", "learningobjectives": "asfdsadf", "assessmentcriteria": "asdfadsf", "scenario": "asdfasdfasf", "tasknumber": 1, "taskarea": [ "adfafads" ], "librarylinks": [ "afdasfasdf" ], "studylinks": [ "asdfasafs" ], "videoslinks": [ "afdaafd", "asfdasfasf" ] } }
前端代码
HTML 删除按钮
<button class="btn rounded-pill btn-primary remove_module remove_module_button" data-id="5" data-modulename="module_1" type="button" > Remove Module <i class="bx bx-x-circle ml-1"></i> </button>
jQuery 点击逻辑
$(document).on('click', '.remove_module', function() { var id = $(this).data('id'); var modulename = $(this).data('modulename'); var ok = confirm("Are you sure, you want to delete this Module?"); if (ok) { $.ajax({ method: "GET", url: "deletemodule", data: { id: id, modulename: modulename }, success: function(data) { if (data == 1) { alert("Course Deleted Successfully!"); window.location.reload(); } } }); } });
后端PHP代码(Laravel)
目前只完成了数据获取部分:
public function deleteModule(Request $request){ $id = $request->id; $modulename = $request->modulename; $data = Course::where('id', $id)->get(); $modueldata = $data[0]->modules; // 从modules字段获取模块数据(JSON格式) }
需求与期望结果
需要实现:删除用户指定的模块对象,将剩余模块按顺序重新命名为module_1、module_2……
处理后的期望结果:
{ "module_1": { "modulename": "asasdasd", "moduletypes": "optional", "moduleid": "23443", "moduleaim": "asdasgdfg", "learningobjectives": "dgdg", "assessmentcriteria": "dfgdg", "scenario": "dgdgdg", "tasknumber": 1, "taskarea": [ "dgdfgdfg" ], "librarylinks": [ "dfgdfgdfg" ], "studylinks": [ "dgdfgdfg" ], "videoslinks": [ "dgdfgdfg", "sdfasdfasf" ] }, "module_2": { "modulename": "science", "moduletypes": "optional", "moduleid": "3234", "moduleaim": "sadfsdfgsdaf", "learningobjectives": "asfdsadf", "assessmentcriteria": "asdfadsf", "scenario": "asdfasdfasf", "tasknumber": 1, "taskarea": [ "adfafads" ], "librarylinks": [ "afdasfasdf" ], "studylinks": [ "asdfasafs" ], "videoslinks": [ "afdaafd", "asfdasfasf" ] } }
解决方案
核心逻辑在后端PHP中完成,步骤如下:
- 将JSON格式的模块数据解码为数组
- 删除指定的模块键
- 提取剩余模块的所有值,重新按
module_1、module_2的规则生成新键 - 将新数组编码为JSON,更新回Course模型
- 返回成功响应
修改后的PHP方法代码:
public function deleteModule(Request $request){ $id = $request->id; $modulename = $request->modulename; // 查找对应课程,使用first()而非get(),直接获取单条记录 $course = Course::where('id', $id)->first(); if(!$course){ return response()->json(0); } // 解码模块数据为数组 $modules = json_decode($course->modules, true); // 删除指定模块 if(isset($modules[$modulename])){ unset($modules[$modulename]); } // 重新生成有序的模块键名 $newModules = []; $index = 1; foreach($modules as $module){ $newModules["module_{$index}"] = $module; $index++; } // 重新编码为JSON并保存 $course->modules = json_encode($newModules); $course->save(); // 返回成功标识 return response()->json(1); }
补充说明
- 使用
first()替代get(),避免额外的数组索引操作,更高效 - 增加了课程存在性判断,避免空指针错误
- 遍历剩余模块时按原顺序重新命名,保证排序正确
- 最后返回JSON格式的响应(原代码直接返回1,改为json响应更规范,前端逻辑无需修改)
内容的提问来源于stack exchange,提问作者Danish Malik
相关产品推荐
相关产品推荐

