fico7489 / laravel-updated-related
当模型或任何相关模型被更新、创建或删除时,更新Elasticsearch数据或清除缓存。
Requires
- illuminate/database: ^5.5|^6.0|^7.0
Requires (Dev)
Suggests
- fico7489/laravel-pivot: Cover pivot changes.
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
自由软件,太棒了!