laravel 中记录更新时如何全局执行操作

问题描述 投票:0回答:3

每当

UpdateRateZone
模型在系统中的任何位置更新时,是否可以在全球范围内运行此作业
Consignment

一种方法是使用

Observer
,但观察者在一次更新多个记录时不起作用,例如:

Consignment::where('status',1)->update(['address'=>'This']);

我们还有什么可以做的吗?

laravel eloquent laravel-8
3个回答
1
投票

根据 Laravel 文档:

通过 Eloquent 发布批量更新时,保存、保存、更新、 并且不会为更新的模型触发更新的模型事件。 这是因为在发出模型时从未实际检索到模型 大量更新。

Laravel 在大规模更新时不会触发

updated
事件,因此据我所知这是不可能的。另一种方法是手动完成。

除了

observers
之外,还有诸如使用事件闭包手动注册事件之类的方法,但只要
laravel
mass updation
上触发事件,所有这些方法都可以工作。


0
投票

是的,您可以为您的模型创建一个事件监听器。您可以阅读更多信息这里

简而言之,首先您需要为所需模型创建一个事件,因此如果它是更新事件,请创建类似这样的事件。

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,
];

-1
投票

当你这样做时:

Model::where('status',1)->update([some stuff]);

执行查询生成器的 update() 方法,而不是 Eloquent 的 update() 方法。

如果要触发Eloquent事件,则需要逐行更新。 您可以手动触发这些事件,但这很棘手,而且不是一个好主意。

您可以为所有更新的寄售手动运行

UpdateRateZone
作业

© www.soinside.com 2019 - 2024. All rights reserved.