Laravel框架save方法失效求助:参数无默认值报错
我碰到好多个开发者都遇到过这个坑,明明已经把字段数据传进去了,用save()或者update()的时候却还是报“字段无默认值”的错误,结合你的代码片段来看,大概率是下面几个原因,你可以逐一排查:
1. 模型没设置可填充字段($fillable)
这是Laravel里最常见的原因!Eloquent有批量赋值保护,如果你的Producto_nombre模型没有把那个报错的字段加到$fillable数组里,哪怕你把数据传得再对,Eloquent也不会把它写入数据库,数据库自然就会因为字段要求非空但没拿到值而报错。
解决起来很简单,打开你的Producto_nombre模型,把需要写入的字段都加到$fillable里:
class Producto_nombre extends Model { // 把所有需要通过create/update/save写入的字段都列在这里 protected $fillable = ['codigo', 'nombre', /* 其他相关字段 */]; }
2. 请求数据被验证规则过滤掉了
看你的代码里只给codigo设置了验证规则,如果那个报错的字段没有包含在$reglas里,而且你用了$request->validate($reglas)的话,Laravel会自动过滤掉验证规则里没有的字段——也就是说,你以为传进去的字段,其实根本没到后续的逻辑里。
解决方法有两个:
- 要么把所有需要写入数据库的字段都加到验证规则里(哪怕只是
'required'或者'nullable'); - 要么如果某些字段不需要验证,就用
$request->only()明确指定要获取的字段,比如:// 明确获取需要的字段,避免被过滤 $data = $request->only(['codigo', 'nombre', /* 其他字段 */]);
3. 字段名拼写不一致
这个属于低级但容易犯的错误:代码里用的字段名和数据库里的字段名不一样,比如代码里写的是nombre,但数据库里是nombre,或者大小写不一致(虽然MySQL默认不区分,但其他数据库可能会)。这种情况下,你以为传了数据,但实际上数据库根本没收到对应字段的值,自然报无默认值。
解决方法:仔细核对你的代码字段名和数据库表的字段名,确保完全一致。
4. 更新逻辑里没给模型赋值就save()
看你的代码片段,你查到了$producto_nombre实例,但如果后续没有把请求数据赋值给这个实例就直接调用save(),那模型里根本没有要更新的字段值,数据库还是会报错。
正确的更新逻辑应该是这样的(结合验证):
public function store(Request $request) { $producto_nombre = Producto_nombre::where('codigo', $request->codigo)->first(); // 基础验证规则,包含所有需要的字段 $reglas = [ 'codigo' => 'required', 'nombre' => 'required', // 比如这个是报错的字段,一定要加进来 // 其他字段的验证规则 ]; // 更新时调整唯一验证规则 if ($producto_nombre) { $reglas['codigo'] = [ 'required', Rule::unique('producto_nombre')->ignore($producto_nombre->id) ]; } else { $reglas['codigo'] = [ 'required', Rule::unique('producto_nombre') ]; } // 先验证请求数据 $validated = $request->validate($reglas); if ($producto_nombre) { // 把验证后的数据填充到模型,再保存 $producto_nombre->fill($validated); $producto_nombre->save(); } else { // 新增数据 Producto_nombre::create($validated); } // 后续的跳转或响应逻辑 return redirect()->back()->with('success', '操作成功'); }
你可以先从第一个原因开始排查,大部分情况下都是$fillable没设置导致的问题。
内容的提问来源于stack exchange,提问作者Christian

