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

如何在Laravel中结合Spatie Activitylog实现软删除日志记录?

正确配置Spatie Laravel Activitylog记录软删除操作

以下是解决问题的具体步骤和排查点:

1. 模型核心配置(关键)

确保你的模型同时启用SoftDeletes和LogsActivity trait,并开启软删除日志开关:

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Activitylog\Traits\LogsActivity;

class YourModel extends Model
{
    use SoftDeletes, LogsActivity;

    // 方式1:记录所有fillable属性
    protected $logFillable = true;
    // 方式2:指定要记录的属性数组
    // protected $logAttributes = ['name', 'email'];

    // 必须开启这一行,默认是false,不记录软删除
    protected static bool $logSoftDeletes = true;

    // 可选:自定义日志描述(让日志更易读)
    public function getDescriptionForEvent(string $eventName): string
    {
        return match($eventName) {
            'deleted' => "软删除了ID为{$this->id}的模型",
            'restored' => "恢复了ID为{$this->id}的模型",
            default => parent::getDescriptionForEvent($eventName),
        };
    }
}

2. 移除冲突的自定义观察者

如果你之前手动添加了模型观察者,且观察者的deleted方法没有正确处理软删除逻辑,可能会覆盖LogsActivity trait的默认行为。建议暂时移除自定义观察者,先测试默认配置是否生效。

如果必须保留观察者,需要在deleted方法中手动判断软删除并记录日志:

class YourModelObserver
{
    public function deleted(YourModel $model)
    {
        // 仅在软删除时记录日志
        if ($model->isSoftDeleted()) {
            activity()
                ->performedOn($model)
                ->withProperties(['original_attributes' => $model->getOriginal()])
                ->log("软删除了模型(ID: {$model->id})");
        }
    }
}

3. 验证基础条件

  • 确认模型的软删除功能本身正常:执行$model->delete()后,数据库中deleted_at字段会被填充。
  • 确认activity_log表已正确生成:运行过Spatie包的迁移命令php artisan migrate,表中包含properties(JSON类型)等必要字段。
  • 测试软删除操作:执行软删除后,直接查询activity_log表,查看是否生成了event为deleted的日志条目。

内容的提问来源于stack exchange,提问作者Pavel Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:34:55