Laravel点击表格insert按钮始终插入最后一行数据问题
问题成因
- 所有行的隐藏输入框均使用
name="ft"作为字段名,且全部绑定到同一个id为regForm的表单。表单提交时会收集页面内所有关联的同名字段,后端读取同名请求参数时默认返回最后一个匹配的值,因此无论点击哪一行的按钮,最终入库的永远是最后一行的数据。 - HTML嵌套不符合规范:
<tr>标签的直接子元素仅允许为<td>或<th>,你将隐藏输入框直接放在<tr>标签下,浏览器渲染时会自动把这些错位的元素归集到表单位置,进一步加剧参数收集错乱的问题。
修改方法
直接调整Blade模板结构即可,不需要改动现有控制器核心逻辑,核心改动是每行对应一个独立表单,把隐藏输入框放到单元格内部,符合HTML嵌套规则:
<div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>header 1</th> <th>header 2</th> <th>button</th> </tr> </thead> <tbody id="myTable"> @foreach($features as $feature) <tr> <td>{{ $feature->detail }}</td> <td>row</td> <td> <form action="{{route('sendDate')}}" method="post"> @csrf <input type="hidden" name="ft" value="{{ $feature->detail }}"> <button type="submit">insert</button> </form> </td> </tr> @endforeach </tbody> </table> </div>
可选优化:Laravel Eloquent模型默认会自动维护
created_at、updated_at时间字段,控制器里手动给$data->created_at赋值的代码可以删除,不会影响功能。
如果不想在表格里嵌套多个表单,也可以给每个insert按钮加data-ft属性存储当前行的内容,点击时通过AJAX提交对应参数,这种方式不需要写form标签,适合前端交互更复杂的场景。
内容的提问来源于stack exchange,提问作者1K412
相关产品推荐
相关产品推荐

