【发布时间】:2019-05-28 13:26:25
【问题描述】:
使用 Laravel 和 Eloquent,如果名为 status 的列将其值更改为“完成”,例如,是否可以自动将另一列 (issue_id) 的值更改为 NULL?
我想知道 set 属性或拦截 save() 方法,但不确定哪个最好。
【问题讨论】:
使用 Laravel 和 Eloquent,如果名为 status 的列将其值更改为“完成”,例如,是否可以自动将另一列 (issue_id) 的值更改为 NULL?
我想知道 set 属性或拦截 save() 方法,但不确定哪个最好。
【问题讨论】:
您可以使用Observers。
例如,要观察Issue 模型,您可以像这样生成一个观察者:
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;
}
}
}
要注册 Observer,您需要将其添加到 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。
【讨论】:
updated 中调用save 这不是无限调用updated 吗?