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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:15:39