使用Laravel&Eloquent,例如,如果名为status
的列将其值更改为“ complete”,是否可以将另一列(issue_id
)的值自动更改为NULL?< / p>
我想知道set属性或拦截save()方法,但不确定哪一个最好。
答案 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。