每当
UpdateRateZone
模型在系统中的任何位置更新时,是否可以在全球范围内运行此作业 Consignment
?
一种方法是使用
Observer
,但观察者在一次更新多个记录时不起作用,例如:
Consignment::where('status',1)->update(['address'=>'This']);
我们还有什么可以做的吗?
是的,您可以为您的模型创建一个事件监听器。您可以阅读更多信息这里
简而言之,首先您需要为所需模型创建一个事件,因此如果它是更新事件,请创建类似这样的事件。
php artisan make:event Consignment/Updated
在该文件中添加
class Updated
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* @var Consignment
*/
public $consignment;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Consignment $consignment)
{
$this->consignment= $consignment;
}
/**
* Get the event consignment property
*
* @return Consignment
*/
public function getConsignment()
{
return $this->consignment;
}
}
现在您必须为此事件创建一个监听器
php artisan make:listener Consignment/UpdatedEvent
并在句柄函数中添加你的逻辑
/**
* Handle the event.
*
* @param Updated $event
* @return void
*/
public function handle(Updated $event)
{
//
}
之后剩下的就是为您的模型注册事件,然后在您添加的 Consignment.php 类中执行此操作
/**
* The event map for the category.
*
* @var array
*/
protected $dispatchesEvents = [
'updated' => Updated::class,
];
当你这样做时:
Model::where('status',1)->update([some stuff]);
执行查询生成器的 update() 方法,而不是 Eloquent 的 update() 方法。
如果要触发Eloquent事件,则需要逐行更新。 您可以手动触发这些事件,但这很棘手,而且不是一个好主意。
您可以为所有更新的寄售手动运行
UpdateRateZone
作业