esign/laravel-database-auditing

使用数据库触发器跟踪Laravel中的数据库更改。

1.1.0 2024-03-12 22:56 UTC

This package is auto-updated.

Last update: 2024-09-13 09:21:27 UTC


README

Latest Version on Packagist Total Downloads GitHub Actions

此包允许您使用数据库触发器跟踪数据库中的更改。目前仅支持MySQL。

注意 此包旨在跟踪Laravel之外发生的数据库更改。然而,对于起源于Laravel应用程序的更改,其他解决方案如owen-it/laravel-auditing可能更适合您的需求。

安装

您可以通过composer安装此包

composer require esign/laravel-database-auditing

该包将自动注册服务提供者。

该包包含一个迁移来存储您的数据库更改。您可以发布迁移文件

php artisan vendor:publish --provider="Esign\DatabaseAuditing\DatabaseAuditingServiceProvider" --tag="migrations"

运行此命令将发布以下迁移

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('audits', function (Blueprint $table) {
            $table->id();
            $table->string('event');
            $table->morphs('auditable');
            $table->json('old_data')->nullable();
            $table->json('new_data')->nullable();
            $table->timestamp('created_at')->useCurrent();
            $table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('audits');
    }
};

接下来,您可以选择发布配置文件

php artisan vendor:publish --provider="Esign\DatabaseAuditing\DatabaseAuditingServiceProvider" --tag="config"

配置文件将发布为config/database-auditing.php,内容如下

return [
    /**
     * Specifies the model used by the package to retrieve audits.
     */
    'model' => Esign\DatabaseAuditing\Models\Audit::class,
];

用法

创建数据库触发器

要跟踪数据库更改,请使用php artisan make:audit-trigger命令。这将生成包含必要触发器配置的迁移文件

use Esign\DatabaseTrigger\DatabaseTrigger;
use Esign\DatabaseTrigger\Enums\TriggerEvent;
use Esign\DatabaseTrigger\Enums\TriggerTiming;
use Esign\DatabaseTrigger\Facades\Schema;
use Illuminate\Database\Migrations\Migration;

return new class extends Migration
{
    public function up(): void
    {
        Schema::createTrigger('audit_after_posts_insert', function (DatabaseTrigger $trigger) {
            $trigger->on('posts');
            $trigger->timing(TriggerTiming::AFTER);
            $trigger->event(TriggerEvent::INSERT);
            $trigger->statement("
                insert into audits (
                    event,
                    auditable_type,
                    auditable_id,
                    old_data,
                    new_data
                ) values (
                    'insert',
                    'post',
                    NEW.id,
                    NULL,
                    JSON_OBJECT('title', NEW.title, 'slug', NEW.slug)
                );
            ");
        });
    }

    public function down(): void
    {
        Schema::dropTriggerIfExists('audit_after_posts_insert');
    }
};

默认情况下,将自动根据提供的输入分配触发器名称。但是,您可以通过将其作为第一个参数传递来指定不同的名称

php artisan make:audit-trigger my_trigger

检索跟踪的更改

在运行触发器迁移后,对相关表所做的任何修改都将自动监视并存储在audits表中。

以下是根据不同的触发器事件在audits表中存储审计的表示

要检索Laravel项目中记录的更改,您可以使用包提供的Esign\DatabaseAuditing\Models\Audit模型。以下是一个示例

use Esign\DatabaseAuditing\Models\Audit;

$audits = Audit::query()->get();

要确定审计中是否发生了任何数据更改,您可以使用Audit模型上可用的hasDataChanges()方法。以下是如何使用它

use Esign\DatabaseAuditing\Models\Audit;

$latestAudit = Audit::latest()->first();
$latestAudit->hasDataChanges();
$latestAudit->hasDataChanges('slug');

hasDataChanges()方法返回一个布尔值,指示是否进行了更改。如果您传递一个特定的属性名称作为参数,它将仅检查该特定属性是否发生了更改。

要基于特定的触发器事件检索审计,您可以使用Audit模型提供的event()范围。以下是一个示例

use Esign\DatabaseAuditing\Models\Audit;
use Esign\DatabaseTrigger\Enums\TriggerEvent;

Audit::event(TriggerEvent::UPDATE)->first();

跟踪Eloquent模型中的更改

要跟踪与您的Eloquent模型相关的更改,将Esign\DatabaseAuditing\Concerns\HasAudits特质应用于相应的模型。例如

use Esign\DatabaseAuditing\Concerns\HasAudits;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasAudits;
}

这将使模型上启用一个audits关系,允许您访问跟踪的更改。例如

$post = Post::first();
$latestAudit = $post->audits()->latest()->first();

请随时探索Esign\DatabaseAuditing\Models\Audit模型以获取更多有关跟踪和检索更改的功能。

测试

composer test

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件