fico7489/laravel-updated-related

当模型或任何相关模型被更新、创建或删除时,更新Elasticsearch数据或清除缓存。

3.0.3 2020-03-26 17:49 UTC

This package is auto-updated.

Last update: 2024-09-07 04:11:33 UTC


README

当模型或任何相关模型被更新、创建或删除时,更新 Elasticsearch 数据或 清除缓存

为什么要使用

在laravel中,我们可以监听eloquent模型(创建、删除、更新)的变化,当模型发生变化时,我们可以对模型进行一些操作,例如,我们可以刷新此模型的缓存。

但有时我们希望在模型变化或相关模型变化时对模型进行一些操作。例如,你有一个包含相关模型Order、ZipCodes、Address和OrderItem的Seller模型。如果Seller、Address、Order、ZipCode或OrderItem发生变化,你想要对Seller执行一些操作,例如刷新Seller的缓存,因为缓存包含相关模型的数据。

$seller = Cache::remember('seller_' . $id, $minutes, function () use($id){
    return Seller::with(['orders', 'orders.items', 'addresses', 'zipCodes'])->find($id);
});

在上面的情况下,当Seller模型发生变化时,我们必须刷新他的缓存'seller'.$id,但当他特定的相关模型更新时,我们也必须刷新数据。显然,这里需要一些相关模型的配置,而这个包将帮助你完成这项工作。

你可以不使用包来添加此功能,但还有一个巨大的问题。你可以映射相关模型和父模型以知道何时刷新缓存,但如果你有批量表单,例如更新所有ZipCodes,并且你有1000个zip代码并且点击保存,缓存将被刷新1000次。这对刷新缓存来说不是一个问题,但如果你必须更新Elasticsearch数据或执行其他耗时操作,那么这将成为一个问题。

此包也解决了上述问题,因为模型变化事件被保存到一个数组中,在请求完成后进行处理,当它们被过滤为唯一事件时,所以如果你为同一卖家更新1000个zip代码,只有一个事件会被触发。

版本兼容性

此包适用于larvel 5.*版本。

安装

1.使用composer安装包

composer require fico7489/laravel-updated-related:"*"

2.将服务提供者添加到config/app.php

Fico7489\Laravel\UpdatedRelated\Providers\UpdatedRelatedServiceProvider::class

3.发布配置

php artisan vendor:publish  --provider="Fico7489\Laravel\UpdatedRelated\Providers\UpdatedRelatedServiceProvider"

然后调整配置(将模型与相关模型映射),更多内容请参阅以下部分。

4.在你的基础模型中使用此特质

Fico7489\Laravel\UpdatedRelated\Traits\UpdatedRelatedTrait 

就这样,你就可以开始了。

配置

配置位于config/laravel-updated-related.php

1.你可以简单地创建配置

return [
    \App\Models\User::class => [
        [
            \App\Models\Address::class         => 'addresses',
            \App\Models\Order::class           => 'orders',
            \App\Models\OrderItem::class       => 'orders.items',
        ],
    ],
];

键是基础模型,值是包含相关模型 => 关系的数组

2.或者,如果你需要为同一基础模型创建更多环境,你可以详细地创建配置。

return [
    \App\Models\User::class => [
        [
            'name' => 'user-simple',
            'related' => [
                \App\Models\Address::class  => 'addresses',
            ],
        ],
        [
            'name' => 'user-extended',
            'related' => [
                \App\Models\Address::class   => 'addresses',
                \App\Models\OrderItem::class => 'orders.items',
            ],
        ],
    ]
];

键是基础模型,值是包含名称(环境名称)和详细配置(包含相关模型 => 关系的数组)的数组。在“简单方式”中,环境将是'default'。

设置配置后,只需监听 ModelChanged 事件即可,该事件将在任何模型或其相关模型(在配置中定义)发生变化(更新、删除、创建)时触发。

一个真实示例

配置

return [
    \App\Models\User::class => [
        [
            \App\Models\Address::class => 'addresses',
        ],
    ],
];

模型

...
class User extends BaseModel
{
    public function addresses()
    {
        return $this->hasMany(Address::class);
    }
...
...
class Address extends BaseModel
{
....

事件服务提供者

...
protected $listen = [
    ModelChanged::class => [
        TestListener::class,
    ],
...

监听器

use Fico7489\Laravel\UpdatedRelated\Events\ModelChanged;

class TestListener
{
    public function handle(ModelChanged $event)
    {
        echo 'id=' . $event->getId();
        echo 'model=' . $event->getModel();
        echo 'environment=' . $event->getName();
    }
}
User::find(1)->touch();
Address::find(2)->touch(); //let's assume that user_id is 10 here

使用上述代码,你将看到以下输出

id=1
model=App\Models\User
environment=default

id=10
model=App\Models\User
environment=default

如果你创建、删除或更新User或Address模型,ModelChanged将被触发。

覆盖数据库中的所有更改

不要使用以下代码

User::whereIn('id', $ids)->update(['status' => 'ban']);

因为在那种情况下,laravel没有使用模型,它直接运行查询而不使用模型。为了覆盖上述更改,你可以将此代码更改为

$users = User::whereIn('id', $ids);
foreach($users as $user){
    $user->update(['status' => 'ban']);
}

枢纽事件

如果你想覆盖枢纽事件,请使用此包:https://github.com/fico7489/laravel-pivot

何时使用此包

  • 清除模型缓存
  • 更新Elasticsearch数据
  • 等等更多

许可证

MIT

自由软件,太棒了!