Laravel 模型关系和模型事件
Laravel model relationships and model events
我目前正在构建一个通知系统,通知通过模型事件传递。一些通知取决于模型关系发生的事情。
示例:我有一个与用户有 one:many 关系的项目模型,
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 已经相当简单和很好地涵盖了这一点,尽管该答案使用了一种稍微较旧的方法,其中 class 本身需要调用其观察者。当前版本的文档(从这个答案开始为 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()
and 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)
{
$dirtyAttributes = $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
}
}
}
我目前正在构建一个通知系统,通知通过模型事件传递。一些通知取决于模型关系发生的事情。
示例:我有一个与用户有 one:many 关系的项目模型,
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 已经相当简单和很好地涵盖了这一点,尽管该答案使用了一种稍微较旧的方法,其中 class 本身需要调用其观察者。当前版本的文档(从这个答案开始为 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()
and 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)
{
$dirtyAttributes = $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
}
}
}