簡體   English   中英

Laravel 模型關系和模型事件

[英]Laravel model relationships and model events

我目前正在構建一個通知系統,通知通過模型事件傳遞。 一些通知取決於模型關系中發生的事情。

示例:我有一個項目模型,它與用戶有一個:多個關系,

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

我想在我的項目模型事件中監視這種關系的變化。 目前,我正在通過執行以下操作來做到這一點,

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

這是在模型的::updating事件中運行,但只查看模型屬性而不是任何關系數據,是否可以獲取舊關系數據和新關系數據進行比較和處理?

您應該為此使用觀察者類

這個 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)
    {
        $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
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM