Laravel 9 CRUD中自定义非空字段'creado'自动赋值失败问题
Laravel 9 自动填充NOT NULL字段及相关问题解决
一、自动填充creado字段的解决方案
方法1:利用模型creating事件(推荐)
在Clientes模型中注册创建前事件,自动为creado赋值,无需依赖请求字段,无论通过何种方式创建模型都会触发:
class Clientes extends Model { public $timestamps = false; protected $fillable = [ // 原fillable字段列表 'creado', ]; protected static function boot() { parent::boot(); // 模型创建前自动设置creado值 static::creating(function ($model) { // 用Carbon生成标准时间格式,或直接用date() $model->creado = now()->format('Y-m-d H:i:s'); }); } // 原有的setPasswordAttribute等方法... }
方法2:控制器手动补充字段值
若不想使用模型事件,可在控制器中给验证后的请求数据添加creado字段:
public function register(RegisterRequest $request) { $validated = $request->validated(); // 手动添加creado字段值 $validated['creado'] = now()->format('Y-m-d H:i:s'); $cliente = Clientes::create($validated); return redirect("login")->with("success","Bla Bla Bla"); }
原setCreadoAttribute不生效的原因
Eloquent的属性setter方法仅在主动给该属性赋值时触发,但你的请求中没有creado字段,create方法只会对请求中存在的fillable字段赋值,因此该setter不会被调用。即使修正setter参数(需接收$value),仍需主动赋值才能触发,不如模型事件便捷。
二、解决password_repeat出现在错误提示中的问题
模型的$hidden属性仅控制模型输出到响应时的字段隐藏,与验证错误提示无关。错误提示显示password_repeat是因为验证规则中定义了该字段,Laravel会返回所有验证失败的字段信息。
自定义错误提示文本(可选)
若不想显示字段名,可在RegisterRequest中添加自定义错误信息:
public function messages() { return [ 'password_repeat.required' => '请再次输入密码', 'password_repeat.same' => '两次输入的密码不一致', ]; }
额外说明
你的模型$fillable中未包含password_repeat,因此create方法不会将该字段存入数据库,这部分逻辑是正常的。
三、关于creado字段nullable验证的说明
验证规则中creado设为nullable|date,但由于视图中无该字段,请求不会包含creado参数,Laravel仅验证请求中存在的字段,因此该规则不会生效。数据库中creado为NOT NULL,必须确保创建时手动赋值,这正是前面两种方案解决的核心问题。
内容的提问来源于stack exchange,提问作者Fernando Gabriel
相关产品推荐
相关产品推荐

