编程语言
首页 > 编程语言> > php-Laravel模型关系和模型事件

php-Laravel模型关系和模型事件

作者:互联网

目前,我正在构建一个通知系统,并且通知是通过模型事件传递的.有些通知取决于模型关系中发生的事情.

示例:我有一个项目模型,该模型与用户具有“一对多”关系,

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

我想在我的项目模型事件中监视这种关系的变化.目前,我正在通过以下操作做到这一点,

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

这在模型的:: updating事件中运行,但仅查看模型属性,而不查看其任何关系数据,是否有可能获取旧的关系数据和新的关系数据进行比较和处理?

解决方法:

您应该为此使用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
        }
    }
}

标签:laravel,eloquent,relational-database,php
来源: https://codeday.me/bug/20191028/1949233.html