Laravel 5.4报错SQLSTATE[HY000]:practice_name字段无默认值求助
解决Laravel 5.4中SQLSTATE[HY000]: 1364字段无默认值的问题
Hey Todd, 这问题我刚学Laravel的时候也踩过一模一样的坑!本质就是你的表单字段、模型批量赋值规则和数据库字段没对应上,咱们一步步捋明白:
先搞懂报错原因
你看到的错误:
SQLSTATE[HY000]: General error: 1364 Field 'practice_name' doesn't have a default value
意思是数据库里的practice_name字段要求必须有值,但你提交表单后,这个字段根本没被赋值就尝试存入数据库了。
对照你的代码找问题
咱们把你的代码拆开来对比:
- HTML表单里的输入框name是
practice_name,提交后请求里确实会带这个参数,这部分没问题; - 但你的Provider模型里的
$fillable设置的是['provider_name']——这是Laravel的批量赋值白名单,只有在这个数组里的字段才能通过create()或者fill()方法赋值。你表单传的是practice_name,不在白名单里,模型直接忽略了这个参数,导致数据库的practice_name字段没拿到值,自然就报错了。
两种解决方案(看你实际需求)
方案一:数据库字段就是practice_name,模型写错了
直接修改Provider模型的$fillable,把practice_name加进去(如果provider_name是多余的就删掉):
protected $fillable = ['practice_name'];
然后在控制器里确保用批量赋值创建记录,比如:
// 要么用全部请求参数(注意安全,只在你信任所有表单字段时用) Provider::create($request->all()); // 更稳妥的方式:指定字段 Provider::create([ 'practice_name' => $request->input('practice_name') ]);
方案二:你本来想存的是provider_name,数据库字段名写错了
如果你的业务逻辑里应该是provider_name,那需要:
- 修改数据库表结构,把
practice_name字段改成provider_name(可以通过迁移文件或者直接操作数据库); - 更新HTML表单里的输入框name:
<input type="text" class="form-control" name="provider_name" id="practice_name">
- 模型的
$fillable保持['provider_name']不变,控制器里用$request->input('provider_name')获取值即可。
额外提醒:别忘加CSRF令牌!
Laravel5.4里POST表单必须要有CSRF令牌验证,你现在的表单里没看到@csrf指令,记得在form标签内加上:
<form method="post" action="/providers"> @csrf <!-- 你的表单内容 --> </form>
不然提交表单会报CSRF令牌不匹配的错误,这也是初学者容易漏掉的点~
内容的提问来源于stack exchange,提问作者Todd H
相关产品推荐
相关产品推荐

