通常,数据库中的数据被创建,修改,删除之后,我们想让他处理一些逻辑,观察者就是不错的选择。
laravel – 观察者官方文档
当前表中 有clue_ratio字段,paraent_name 表示 username的上级名称,我们想让其clue_ratio 字段和上级的保持同步,但上级的修改时,下级进行同步(公司和员工)
一、创建新的观察者类 并指定模型名
shell
php artisan make:observer SyncRadioObserver --model=AdminUser
二、
要注册观察者,可以将 ObservedBy
属性放在相应的模型上:
php
use App\Observers\UserObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
#[ObservedBy([UserObserver::class])]
class User extends Authenticatable
{
//
}
或者,您可以通过在模型上调用 observe
方法来手动注册一个观察者。你可以在应用程序的 AppServiceProvider
类的 boot
方法中注册观察者:php
use App\Models\AdminUser;
use App\Observers\SyncRadioObserver;
/**
* 启动任何应用程序服务。
*/
public function boot(): void
{
AdminUser::observe(SyncRadioObserver::class);
}
三、 修改观察者中的update函数
SyncRadioObserver.php
<?php
//////namespace use
class SyncRadioObserver
{
public function updated(AdminUser $adminUser)
{
AdminUser::syncRadio($adminUser);
}
}
AdminUser.php
<?php
namespace App\Models;
use ...
class AdminUser extends Model
{
protected $table = 'admin_users';
protected $guarded = []; //黑名单为空
public static function syncRadio()
{
AdminUser::where('parent_name', $adminUser->username)
->update(['clue_ratio' => $adminUser->clue_ratio]);
}
}
摘抄:观察者和数据库事务
当模型在数据库事务中创建时,您可能希望指示观察者仅在数据库事务提交后执行其事件处理程序。您可以通过在观察者上实现
ShouldHandleEventsAfterCommit
接口来实现这一点。如果没有正在进行的数据库事务,事件处理程序将立即执行。<?php namespace App\Observers; use App\Models\AdminUser; use Illuminate\Contracts\Events\ShouldHandleEventsAfterCommit; class UserObserver implements ShouldHandleEventsAfterCommit { /** * 处理 User "created" 事件。 */ public function created(User $user): void { // ... } public function updated(AdminUser $adminUser) { // } }