单选按钮传递错误值:无论选择何值仅存入admin
admin值的问题 我来帮你梳理下这个问题的排查线索,毕竟明明选了operator却只存入admin,大概率是前端交互、模型配置或者数据库设置的问题,咱们一步步来:
1. 先确认前端实际提交的level值到底是什么
在你的store控制器方法最开头,先加一行代码打印请求里的level参数,看看实际提交的内容:
public function store(Request $request) { // 打印level值,确认提交的内容 dd($request->input('level')); $data = $request->all(); // ... 后续代码 }
如果打印出来的是admin,那问题肯定在前端;如果是operator,那问题就出在后端的模型或者数据库配置上。
2. 检查Semantic UI单选按钮的初始化
你用了Semantic UI的ui radio checkbox组件,这类组件需要通过JS初始化才能正常切换选中状态。如果没初始化,你点击operator的时候,浏览器原生的单选按钮checked属性根本没变化,还是默认选中第一个admin选项。
确保你的页面里有这段初始化代码(放在页面底部或者DOM加载完成的事件里):
$('.ui.radio.checkbox').checkbox();
3. 修正Laravel Collective表单组件的选中状态绑定
你的Blade代码里,Form::radio没有绑定旧值或者选中状态,哪怕前端正常工作,当验证失败回显表单时,也可能默认选中第一个选项。应该给每个单选按钮加上第三个参数,用来判断是否选中:
{{-- Administrator选项 --}} {{ Form::radio('level', 'admin', old('level') === 'admin') }} {{-- Operator选项 --}} {{ Form::radio('level', 'operator', old('level') === 'operator') }}
这样无论是首次加载还是验证失败回显,都能正确对应选中的选项。
4. 检查User模型的批量赋值权限
Laravel的批量创建(User::create($data))需要模型里的$fillable数组包含level字段,否则这个字段会被忽略,数据库就会存入字段的默认值(如果默认是admin的话)。
打开你的User模型,确认$fillable里有level:
class User extends Model { protected $fillable = [ 'name', 'email', 'password', 'level', // 必须包含level ]; }
5. 检查数据库表的level字段默认值
最后,看看users表的level字段有没有设置默认值为admin。如果前面的步骤都没问题,但数据库还是存admin,很可能是字段默认值在兜底。你可以通过数据库管理工具(比如phpMyAdmin)或者迁移文件查看:
// 示例迁移代码,检查default值 $table->enum('level', ['admin', 'operator'])->default('admin');
如果有这个default('admin'),当请求没有正确传递level值时,就会自动存入admin。
内容的提问来源于stack exchange,提问作者Yudy Ananda

