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

Laravel Spatie Activitylog配置:记录模型更新时的修改字段

Laravel Spatie Activitylog: 记录修改字段到properties数组

嗨,你已经做对了大部分基础配置!目前$logOnlyDirty = true已经会让日志只追踪被修改过的字段,要确保这些修改内容正确存入properties数组,还可以补充以下配置和操作:

1. 精准控制记录字段(可选但推荐)

如果只想追踪特定字段的修改,或者排除一些不需要的字段(比如updated_at),可以添加静态属性:

// 只记录title和content字段的修改
protected static $logAttributes = ['title', 'content'];

// 排除updated_at字段不被记录
protected static $ignoreChangedAttributes = ['updated_at'];

2. 使用更灵活的getActivitylogOptions方法(推荐替代静态属性)

Spatie官方更推荐用这个方法集中管理日志配置,比静态属性更灵活,还能实现更多自定义逻辑:

use Spatie\Activitylog\LogOptions;

public function getActivitylogOptions(): LogOptions
{
    return LogOptions::defaults()
        ->logName('Posts')
        ->logOnlyDirty() // 仅记录修改过的字段
        ->logOnly(['title', 'content']) // 指定要追踪的字段(可选)
        ->dontLogIfAttributesChangedOnly(['updated_at']) // 排除特定字段(可选)
        ->submitEmptyLogs(false); // 无修改时不生成空日志(默认false,可选)
}

使用这个方法后,你可以移除之前的$logName、$logOnlyDirty等静态属性,统一用该方法管理所有日志配置。

3. 确认数据库字段类型

确保activity_log表中的properties字段是JSON类型(这是包的默认配置),这样才能正确存储字段修改的数组数据。如果你的表结构不符合,可以创建迁移修改:

Schema::table('activity_log', function (Blueprint $table) {
    $table->json('properties')->change();
});

4. 验证日志记录效果

当你更新模型后,可以通过模型的关联关系查看日志详情:

// 获取当前模型最新的一条日志
$latestActivity = $yourPostModel->activities()->latest()->first();

// 查看properties数组里的字段修改内容
dd($latestActivity->properties);

输出的properties会包含attributes(修改后的新值)和old(修改前的旧值)两个子数组,清晰展示每个字段的变化。

额外:自定义日志描述(可选)

如果想让日志的description字段更具可读性,可以重写getDescriptionForEvent方法:

public function getDescriptionForEvent(string $eventName): string
{
    return "Post was {$eventName} by " . auth()->user()->name;
}

内容的提问来源于stack exchange,提问作者Pranav Mandlik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:26:12