如果另一个值更新,则自动更改模型值

时间:2019-01-01 16:40:30

标签: php laravel eloquent

使用Laravel&Eloquent,例如,如果名为status的列将其值更改为“ complete”,是否可以将另一列(issue_id)的值自动更改为NULL?< / p>

我想知道set属性或拦截save()方法,但不确定哪一个最好。

1 个答案:

答案 0 :(得分:0)

您可以使用Observers

例如,要观察Issue模型,可以这样生成一个Observer:

php artisan make:observer IssueObserver --model=Issue

这将产生一个观察者,您可以在其中收听许多模型事件。

<?php

namespace App\Observers;

use App\Issue;

class IssueObserver
{

    /**
    * Handle the Issue "updating" event.
    *
    * @param  \App\Issue  $Issue
    * @return void
    */
    public function updating(Issue $issue)
    {
        if($issue->status == 'complete') {
            $issue->issue_id = null;
        }
    }
}

要注册观察者,您需要将其添加到AppServiceProvider@boot()

<?php

namespace App\Providers;

use App\Issue;
use App\Observers\IssueObserver;
use Illuminate\Support\ServiceProvider;

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

    /**
    * Register the service provider.
    *
    * @return void
    */
    public function register()
    {
        //
    }
}

您也可以在您的App/Issue模型中执行此操作。

public static function boot()
{
    parent::boot(); 

    static::updating(function ($issue) {
        if($issue->status == 'complete') {
            $issue->issue_id = null;
        }
    })
}

很显然,您需要倾听适合您需求的事件。这只是一个例子。您可以查看所有可用的模型事件here