Laravel使用create方法新增数据报1364字段无默认值错误如何解决
报错信息
SQLSTATE[HY000]: General error: 1364 Field 'product_name' doesn't have a default value
错误触发原因
- 提交数据的字段名与数据库字段不匹配:你表单提交的商品名称字段为
pro_name,而数据库对应字段为product_name,$request->all()获取的数组中键名是pro_name,直接传入create()方法时无法匹配到product_name字段,导致该字段为空触发报错。同理你手动赋值时用到的SDAT对应数据库Starting_Date_and_Time、EDAT对应Ending_Date_and_Time也存在同样的字段名不匹配问题。 - 未开启模型批量赋值权限:Laravel的
create()等批量赋值方法会默认过滤不在模型$fillable白名单内的字段,即使你传入的字段名匹配,如果没有在模型中配置允许批量赋值,对应字段也会被过滤为空。
解决方法
- 第一步:做字段名映射,把提交的字段名转换为数据库对应的字段名,修改
store方法代码:
public function store(Request $request) { $data = $request->all(); // 字段名映射 $data['product_name'] = $data['pro_name']; $data['Starting_Date_and_Time'] = $data['SDAT']; $data['Ending_Date_and_Time'] = $data['EDAT']; // 移除多余的原字段 unset($data['pro_name'], $data['SDAT'], $data['EDAT']); $product = product::create($data); dd($product); }
- 第二步:配置
Product模型的批量赋值白名单,打开app/Product.php添加如下代码:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Product extends Model { // 配置允许批量赋值的字段 protected $fillable = [ 'product_name', 'description', 'Starting_Date_and_Time', 'Ending_Date_and_Time' ]; }
- 可选替代方案:如果是内部自用项目,不需要严格限制批量赋值字段,可以直接在模型中设置
$guarded为空数组,代表所有字段都允许批量赋值:
// 放在Product模型类内 protected $guarded = [];
内容的提问来源于stack exchange,提问作者vikas saini
相关产品推荐
相关产品推荐

