Laravel/Ajax编辑同group_id不同id行时获取错误行数据问题
编辑表单查询数据表时返回错误行记录
为解释标题所述问题,先展示我的数据表,表中存在多条group_id相同但id不同的记录
以下是页面对应的输出记录:我在名称旁添加了id用于展示取值
我遇到的问题是:比如点击id=41、group_id=1的首行编辑按钮时,文本框展示的是id=1、group_id=1的记录值
下方是点击id=41行编辑按钮弹出的模态框截图,我额外添加了id和group_id的文本框,用于展示从表中获取的记录信息,可以看到返回的是id=1的行数据,相关代码如下。
路由代码
use App\Http\Controllers\Frontend\BBRCategoryConfigurationController; Route::get('/bbr-group-configuration-edit/{id}', [BBRGroupConfigurationController::class,'edit']);
控制器代码
(数据从HmsBbrGroup模型获取)
public function edit($id) { $group_edit = HmsBbrGroup::find($id); if ($group_edit) { return response()->json([ 'status'=>200, 'group_edit'=>$group_edit, ]); } else { return response()->json([ 'status'=>404, 'message'=>'Group Not Found', ]); } }
Ajax代码
$(document).on('click','.edit_group',function (e) { e.preventDefault(); $(".save_button").removeClass("add_group").addClass("update_group"); var g_id = $(this).val(); console.log(g_id); $('#group_form').modal('show'); $.ajax({ type: "GET", url: "/clinical/bbr-group-configuration-edit/"+g_id, success: function (response) { console.log(response); if(response.status == 404) { $('#success_message').html(""); $('#success_message').addClass('alert alert-danger'); $('#success_message').text('response.message'); } else { $('#id').val(response.group_edit.id); $('#group_id').val(response.group_edit.group_id); $('#group_name').val(response.group_edit.group_name); $('#group_description').val(response.group_edit.group_description); $('#effective_start_datetime').val(response.group_edit.effective_start_datetime ? 'active' : 'inactive').change(); $('#group_type_id').val(response.group_edit.group_type_id).change(); } } }); });
表单代码
<input type="text" id="id" class="id"> <input type="text" id="group_id" class="group_id"> <input type="text" id="group_name" class="group_name" placeholder="Group Name"> <textarea id="group_description" class="group_description" placeholder="Group Description"> <select id="effective_start_datetime" class="effective_start_datetime"> <select id="effective_start_datetime" class="effective_start_datetime">
注意事项
- 为了获取正确行数据,我将路由设置为按id查询:
/bbr-group-configuration-edit/{id} - Ajax的逻辑是在else分支中将查询到的行数据填充到模态框的对应字段中,对应第三张截图的效果
- 我猜测问题可能和控制器的
$group_edit = HmsBbrGroup::find($id);逻辑有关,但无法理解为什么它会返回相同group_id下id最小的第一条记录
解决方案
按优先级逐一排查即可定位修复:
校验前端传参
打开浏览器控制台,点击id=41对应行的编辑按钮,查看Ajax代码中console.log(g_id)的输出:- 输出为
1:列表渲染时所有.edit_group编辑按钮的value属性错误绑定为第一行id,修改列表循环逻辑,给每个编辑按钮的value赋值为当前行的id即可。 - 输出为
41:问题出在后端逻辑,继续往下排查。
- 输出为
检查模型主键配置
Laravel的find()方法默认按模型定义的主键查询,如果你在HmsBbrGroup模型中手动修改了主键为group_id(类似代码protected $primaryKey = 'group_id';),find(41)会按group_id=41查询,无匹配时就会返回同group_id下的首条记录。
修复方法:确保HmsBbrGroup模型的主键配置为默认的id,或者直接将控制器查询逻辑改为显式按id查询:
$group_edit = HmsBbrGroup::where('id', $id)->first();
- 修复已知代码异常
当前表单存在两个id均为effective_start_datetime的下拉框,DOM id重复会导致后续字段填充异常,删除重复的下拉框即可。
内容的提问来源于stack exchange,提问作者user16409170
相关产品推荐
相关产品推荐

