Laravel模型关系和模型事件

时间:2015-08-03 10:03:13

标签: php laravel eloquent relational-database

我正在建立一个通知系统,通过模型事件传递通知。一些通知取决于模型关系中发生的事情。

示例:我的项目模型与用户有一个:很多关系,

public function projectmanager() {
    return $this->belongsToMany('User', 'project_managers');
}

我想在项目模型事件中监视此关系的更改。目前,我这样做是为了做到这一点,

$dirtyAttributes = $project->getDirty();
foreach($dirtyAttributes as $attribute => $value) {
   //Do something
}

这是在模型的::updating事件中运行,但只查看模型属性而不是任何关系数据,是否可以获取旧的关系数据和新的关系数据进行比较和过程

1 个答案:

答案 0 :(得分:4)

您应该使用observer class

这已经被this SO answer相当简单和完整地涵盖了,尽管这个答案使用了稍微老一些的方法,其中类本身需要调用它的观察者。当前版本的文档(本回答中的5.3)建议在应用程序服务提供程序中注册观察者,在您的示例中,观察者看起来类似于:

<?php
namespace App\Providers;

use App\Project;
use App\Observers\ProjectObserver;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Project::observe(ProjectObserver::class);
    }
}

为了评估新模型值与仍存在于关系数据库中的旧值之间的差异,Laravel为两者提供了方法:getDirty()getOriginal()

所以你的观察者会看起来像:

<?php

namespace App\Observers;

use App\Project;

class ProjectObserver
{
    /**
     * Listen to the Project updating event.
     *
     * @param  Project $project
     * @return void
     */
    public function updating(Project $project)
    {
        $dirtyAttribtues = $project->getDirty();
        $originalAttributes = $project->getOriginal();
        // loop over one and compare/process against the other
        foreach ($dirtyAttributes as $attribute => $value) {
            // do something with the equivalent entry in $originalAttributes
        }
    }
}