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

Laravel如何实现类似created_at的多模型自定义列自动填充功能

Laravel 通过Trait实现自定义字段自动填充方案

实现逻辑

参考Laravel内置SoftDeletes的实现思路:Laravel会自动执行模型引入的Trait中以boot+Trait名称命名的方法,我们可以在该方法中注册模型生命周期事件监听,实现自动填充逻辑,无需重复编码、无需强制继承公共基类。

步骤1:创建自定义填充Trait

在app/Traits目录下创建AutoFillCustomColumn.php,代码如下:

<?php

namespace App\Traits;

trait AutoFillCustomColumn
{
    /**
     * Trait启动方法,Laravel会自动调用
     */
    protected static function bootAutoFillCustomColumn()
    {
        // 监听creating事件:数据写入数据库前自动赋值,无需额外SQL
        static::creating(function ($model) {
            // 支持通过模型常量自定义填充字段,不定义则使用默认字段名
            $fillColumn = defined('static::CUSTOM_FILL_COLUMN') ? static::CUSTOM_FILL_COLUMN : 'default_column';
            
            // 仅当字段未手动赋值时自动填充,和timestamps逻辑保持一致
            if (is_null($model->getAttribute($fillColumn))) {
                // 此处替换为你自己的填充逻辑,以下为示例:填充当前登录用户ID
                $model->setAttribute($fillColumn, auth()->id());
                // 其他填充示例:生成唯一业务单号
                // $model->setAttribute($fillColumn, 'ORD' . date('YmdHis') . random_int(100,999));
            }
        });

        // 如果你的逻辑需要依赖模型写入后生成的主键ID,可替换为created事件监听(对应参考代码1的写法)
        // static::created(function ($model) {
        //     // 写入后的业务逻辑
        // });
    }
}

步骤2:在需要的模型中引入Trait

只需要在要开启自动填充的模型中引入该Trait即可生效,示例:

<?php

namespace App\Models;

use App\Traits\AutoFillCustomColumn;
use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
    // 引入Trait开启自动填充
    use AutoFillCustomColumn;

    // 可选:自定义要填充的字段名,不配置则使用Trait中设置的默认值
    const CUSTOM_FILL_COLUMN = 'creator_id';

    // 其他模型配置、属性代码...
}

拓展说明

  • 如需同时填充多个自定义字段,直接在creating回调中添加多段赋值逻辑即可,和Laravel内置timestamps同时处理created_at、updated_at的逻辑一致
  • 赋值判断逻辑支持自定义调整,例如无需保留手动赋值的优先级,可以去掉is_null判断强制覆盖为自动生成的值

内容的提问来源于stack exchange,提问作者Muhammad Umair

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:39:03