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
相关产品推荐
相关产品推荐

