esign / laravel-database-auditing
使用数据库触发器跟踪Laravel中的数据库更改。
Requires
- php: ^8.1
- esign/laravel-database-trigger: ^1.3.0
- illuminate/database: ^9.0|^10.0|^11.0
- illuminate/support: ^9.0|^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.5
- orchestra/testbench: ^7.0|^8.0|^9.0
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^9.0|^10.0
This package is auto-updated.
Last update: 2024-09-13 09:21:27 UTC
README
此包允许您使用数据库触发器跟踪数据库中的更改。目前仅支持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)。有关更多信息,请参阅许可证文件。