You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,那需要:

  1. 修改数据库表结构,把practice_name字段改成provider_name(可以通过迁移文件或者直接操作数据库);
  2. 更新HTML表单里的输入框name:
<input type="text" class="form-control" name="provider_name" id="practice_name">
  1. 模型的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:18:18