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