Laravel 8框架中如何正确获取checkbox复选框的多个选中值
问题根因
你遇到的问题主要由3个错误写法导致:
- Blade模板中循环输出checkbox时,每个选项都单独包裹了
<form>标签,所有checkbox不在同一个表单内,提交时只会提交当前触发提交按钮所在的表单数据,自然只能拿到单个值 - Blade中重复输出
<html>、<body>标签,违反页面结构规范 - 控制器中混用Laravel的
$request请求对象和原生$_POST,同时判断isset($_POST['submit']),如果你的提交按钮没有设置name="submit"属性,这个判断永远不成立,自然进不去循环 - Laravel项目中直接写原生mysqli连接不符合框架规范,也增加了代码维护成本
修复步骤
1. 修改Blade模板
首先在渲染表单页的控制器方法中查询学生数据,不要在Blade中写业务逻辑:
// 渲染编辑页的方法示例 public function edit(Ticket $ticket) { $students = User::query() ->join('model_has_roles', 'model_has_roles.model_id', '=', 'users.id') ->where('model_has_roles.role_id', 14) ->pluck('name', 'id'); return view('你的blade路径', compact('ticket', 'students')); }
然后修改Blade代码,将所有表单元素放在同一个<form>标签内:
<div class="row"> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Students:</strong> <div style="margin-top: 5px" > <!-- form标签包裹所有表单元素和提交按钮,更新请求加上PUT方法伪造 --> <form action="{{ route('ticket.update', $ticket) }}" method="POST"> @csrf @method('PUT') <!-- 原有的gpname、detail、semester、gender等表单字段也要放在这个form内 --> @foreach($students as $id => $name) <div> <input type="checkbox" name="student_id[]" id="student_{{ $id }}" value="{{ $id }}"> <label for="student_{{ $id }}">{{ $name }}</label> </div> @endforeach <!-- 提交按钮也要放在form内,加上name属性 --> <button type="submit" name="submit" class="btn btn-primary">提交</button> </form> </div> </div> </div> </div>
2. 修改控制器update方法
全部用Laravel的$request对象获取请求参数,不要用原生$_POST:
public function update(Request $request, Ticket $ticket) { $validated = $request->validate([ 'gpname' => 'required', 'detail' => 'required', 'semester' => 'required', 'gender' => 'required', // 加student_id的验证规则,array表示接受数组格式 'student_id' => 'nullable|array', 'student_id.*' => 'exists:users,id', ]); $user = Auth::user(); $roles = $user->roles->pluck('name')->toArray(); if($roles[0] == 'Admin'){ $ticket->fill($validated); $ticket->user_id = $user->id; $ticket->save(); // 直接获取所有选中的学生id数组,没选中时默认返回空数组 $selectedStudentIds = $request->input('student_id', []); // 循环处理逻辑直接遍历数组即可 foreach ($selectedStudentIds as $studentId) { // 你的业务逻辑 } // 如果需要把多个学生id存到ticket表,要么新增多对多关联表,要么把student_id字段改为json类型: // $ticket->student_id = json_encode($selectedStudentIds); // $ticket->save(); } return redirect()->back()->with('success', '更新成功'); }
补充说明
如果需要把选中的多个学生ID和工单关联,推荐用Laravel的多对多关联实现,不需要手动拼接json存储,后续查询维护更方便。
内容的提问来源于stack exchange,提问作者Fahad
相关产品推荐
相关产品推荐

