Laravel中如何结合复选框插入多组文本输入数据?
问题描述
需要根据用户输入将数据插入数据库,页面包含多个复选框及对应文本输入框。当前代码仅选中“A”时能正常插入,选中其他选项或多个选项时会出现空值。期望实现的数据库插入效果如下:
checkval win loss draw A 2 3 4 B 3 4 3 C 4 5 5
原表单代码:
<form action=""> <input type="checkbox" name="txt_check[]" id="">A <label for="fname">Win1:</label> <input type="text" id="fname" name="txt_win[]"><br><br> <label for="fname">Win2:</label> <input type="text" id="fname" name="txt_loss[]"><br><br> <label for="fname">Win3:</label> <input type="text" id="fname" name="txt_draw[]"><br><br> <input type="checkbox" name="txt_check[]" id="">B <label for="lname">Loss1:</label> <input type="text" id="fname" name="txt_win[]"><br><br> <label for="lname">Loss2:</label> <input type="text" id="fname" name="txt_loss[]"><br><br> <label for="lname">Loss3:</label> <input type="text" id="fname" name="txt_draw[]"><br><br> <input type="checkbox" name="txt_check[]" id="">C <label for="lname">Draw1:</label> <input type="text" id="fname" name="txt_win[]"><br><br> <label for="lname">Draw2:</label> <input type="text" id="fname" name="txt_loss[]"><br><br> <label for="lname">Draw3:</label> <input type="text" id="fname" name="txt_draw[]"><br><br> <input type="submit" value="Submit"> </form>
原控制器代码:
$win = $request->txt_win; $loss = $request->txt_loss; $draw = $request->txt_draw; $checkValue = $request->txt_check ; foreach ($checkValue as $key => $value) { $result[] = Model::create([ 'checkValue' => $value, 'winning' => $win [$key], 'lost' => $loss [$key], 'draw' => $draw [$key], ]); }
解决方案
问题根源是:未选中的复选框不会被提交,但所有输入框都会提交,导致复选框数组和输入框数组的索引错位,进而出现空值插入。需要让每个选项的复选框与输入框建立明确的关联。
1. 修改表单代码
给复选框设置固定value,并将对应输入框的命名改为结构化数组,确保每个选项的win/loss/draw绑定到同一标识下:
<form action="" method="post"> <!-- Laravel环境下必须添加CSRF令牌 --> @csrf <input type="checkbox" name="selected_items[]" value="A">A <label>Win:</label> <input type="text" name="items[A][win]"><br><br> <label>Loss:</label> <input type="text" name="items[A][loss]"><br><br> <label>Draw:</label> <input type="text" name="items[A][draw]"><br><br> <input type="checkbox" name="selected_items[]" value="B">B <label>Win:</label> <input type="text" name="items[B][win]"><br><br> <label>Loss:</label> <input type="text" name="items[B][loss]"><br><br> <label>Draw:</label> <input type="text" name="items[B][draw]"><br><br> <input type="checkbox" name="selected_items[]" value="C">C <label>Win:</label> <input type="text" name="items[C][win]"><br><br> <label>Loss:</label> <input type="text" name="items[C][loss]"><br><br> <label>Draw:</label> <input type="text" name="items[C][draw]"><br><br> <input type="submit" value="Submit"> </form>
2. 修改控制器代码
直接遍历选中的选项,从结构化数组中取出对应值插入数据库:
// 获取用户选中的选项列表 $selectedItems = $request->input('selected_items', []); // 获取所有选项的输入数据 $itemsData = $request->input('items', []); foreach ($selectedItems as $itemKey) { // 确保对应选项的输入数据存在 if (isset($itemsData[$itemKey])) { $data = $itemsData[$itemKey]; Model::create([ 'checkValue' => $itemKey, 'winning' => $data['win'] ?? null, 'lost' => $data['loss'] ?? null, 'draw' => $data['draw'] ?? null, ]); } }
内容的提问来源于stack exchange,提问作者MM_Chanchal
相关产品推荐
相关产品推荐

