fico7489 / laravel-pivot
本包引入了 BelongsToMany 关联中 sync()、attach()、detach() 或 updateExistingPivot() 方法的新 eloquent 事件。
Requires
- illuminate/database: 5.5.*|6.*|7.*|8.*|9.*|10.*|11.*
Requires (Dev)
- dev-master
- 3.0.12
- 3.0.11
- 3.0.10
- 3.0.9
- 3.0.8
- 3.0.7
- 3.0.6
- 3.0.5
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.3.x-dev
- 2.3.8
- 2.3.7
- 2.2.8
- 2.2.7
- 2.2.6
- 2.2.5
- 2.2.4
- 2.1.x-dev
- 2.1.8
- 2.1.7
- 2.1.6
- 2.1.5
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.x-dev
- 2.0.6
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.3.x-dev
- 1.3.6
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.6
- 1.2.4
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.0.1
- 1.0.0
- dev-test98
- dev-sync-events
- dev-updates2
- dev-updates
- dev-filip-fixes
- dev-new
This package is auto-updated.
Last update: 2024-09-15 09:52:55 UTC
README
本包引入了 BelongsToMany 关联中 sync()、attach()、detach() 或 updateExistingPivot() 方法的新 eloquent 事件。
Laravel 问题
在 Laravel 中,当 BelongsToMany 关联(关联表)通过 sync()、attach()、detach() 或 updateExistingPivot() 方法更新时,不会触发事件,但此包可以帮助解决这个问题。
版本兼容性
- 您仍然可以使用旧于 laravel 5.4.x 的非活动分支
安装
1. 使用 composer 安装包
composer require fico7489/laravel-pivot
此语句将安装与当前 laravel 版本兼容的最高版本包。
2. 在您的基模型或特定模型中使用 Fico7489\Laravel\Pivot\Traits\PivotEventTrait 特性。
use Fico7489\Laravel\Pivot\Traits\PivotEventTrait; use Illuminate\Database\Eloquent\Model; abstract class BaseModel extends Model { use PivotEventTrait; ...
这样就完成了,尽情享受吧。
新 eloquent 事件
您可以在这里查看所有 eloquent 事件:https://laravel.net.cn/docs/5.5/eloquent#events)
新事件有
pivotAttaching, pivotAttached
pivotDetaching, pivotDetached,
pivotUpdating, pivotUpdated
捕获事件的最佳方式是使用以下模型函数
public static function boot() { parent::boot(); static::pivotAttaching(function ($model, $relationName, $pivotIds, $pivotIdsAttributes) { // }); static::pivotAttached(function ($model, $relationName, $pivotIds, $pivotIdsAttributes) { // }); static::pivotDetaching(function ($model, $relationName, $pivotIds) { // }); static::pivotDetached(function ($model, $relationName, $pivotIds) { // }); static::pivotUpdating(function ($model, $relationName, $pivotIds, $pivotIdsAttributes) { // }); static::pivotUpdated(function ($model, $relationName, $pivotIds, $pivotIdsAttributes) { // }); static::updating(function ($model) { //this is how we catch standard eloquent events }); }
您也可以在这里查看这些事件
\Event::listen('eloquent.*', function ($eventName, array $data) { echo $eventName; //e.g. 'eloquent.pivotAttached' });
支持的关联
BelongsToMany 和 MorphToMany
哪些事件被触发以及它们何时被触发
四个 BelongsToMany 方法从本包触发事件
attach()
触发一个 pivotAttaching 和一个 pivotAttached 事件。
即使添加了更多行,也只为所有行触发一个事件。在这种情况下,您可以在 $pivotIds 变量中看到所有更改的行 ID,以及带有属性的更改行 ID 在 $pivotIdsAttributes 变量中。
detach()
触发一个 pivotDetaching 和一个 pivotDetached 事件。
即使删除了更多行,也只为所有行触发一个事件。在这种情况下,您可以在 $pivotIds 变量中看到所有更改的行 ID。
updateExistingPivot()
触发一个 pivotUpdating 和一个 pivotUpdated 事件。
您只能使用 updateExistingPivot 在关联表中更改一行。
sync()
根据在关联表中添加的行数触发多个 pivotAttaching 和 pivotAttached 事件。如果没有添加任何内容,则不会触发这些事件。
触发一个 pivotDetaching 和一个 pivotDetached 事件,但您可以在 $pivotIds 变量中看到所有已删除的 ID。如果没有删除任何内容,则不会触发此事件。
根据在关联表中更新的行数触发多个 pivotUpdating 和 pivotUpdated 事件。如果没有添加任何内容,则不会触发这些事件。
例如,当您调用 sync() 时,如果添加了两个行并删除了两个行,则将触发两个 pivotAttaching 和两个 pivotAttached 事件,以及一个 pivotDetaching 和一个 pivotDetached 事件。
如果调用 sync() 但没有添加或删除行,则不会触发事件。
使用方法
我们在数据库中有三个表:users(id, name),roles(id, name),role_user(user_id, role_id)。我们有两个模型
class User extends Model { use PivotEventTrait; .... public function roles() { return $this->belongsToMany(Role::class); } static::pivotAttached(function ($model, $relationName, $pivotIds, $pivotIdsAttributes) { echo 'pivotAttached'; echo get_class($model); echo $relationName; print_r($pivotIds); print_r($pivotIdsAttributes); }); static::pivotUpdated(function ($model, $relationName, $pivotIds, $pivotIdsAttributes) { echo 'pivotUpdated'; echo get_class($model); echo $relationName; print_r($pivotIds); print_r($pivotIdsAttributes); }); static::pivotDetached(function ($model, $relationName, $pivotIds) { echo 'pivotDetached'; echo get_class($model); echo $relationName; print_r($pivotIds); });
class Role extends Model { ....
附加
对于 attach() 或 detach(),为每个 pivot id 触发一个事件。
使用 int 附加
运行此代码
$user = User::first(); $user->roles()->attach(1);
您将看到以下输出
pivotAttached
App\Models\User
roles
[1]
[1 => []]
使用数组附加
运行此代码
$user = User::first(); $user->roles()->attach([1]);
您将看到以下输出
pivotAttached
App\Models\User
roles
[1]
[1 => []]
使用模型附加
运行此代码
$user = User::first(); $user->roles()->attach(Role::first());
您将看到以下输出
pivotAttached
App\Models\User
roles
[1]
[1 => []]
使用集合附加
运行此代码
$user = User::first(); $user->roles()->attach(Role::get());
您将看到以下输出
pivotAttached
App\Models\User
roles
[1, 2]
[1 => [], 2 => []]
使用数组 (id => attributes) 附加
运行此代码
$user = User::first(); $user->roles()->attach([1, 2 => ['attribute' => 'test']], ['attribute2' => 'test2']);
您将看到以下输出
pivotAttached
App\Models\User
roles
[1, 2]
[1 => [], 2 => ['attribute' => 'test', 'attribute2' => 'test2']]
同步
对于sync()方法,每个枢纽行都会触发一个事件。
运行此代码
$user = User::first(); $user->roles()->sync([1, 2]);
您将看到以下输出
pivotAttached
App\Models\User
roles
[1]
[1 => []]
pivotAttached
App\Models\User
roles
[2]
[2 => []]
断开连接
运行此代码
$user = User::first(); $user->roles()->detach([1, 2]);
您将看到以下输出
pivotDetached
App\Models\User
roles
[1, 2]
更新中
运行此代码
$user = User::first(); $user->roles()->updateExistingPivot(1, ['attribute' => 'test']);
您将看到以下输出
pivotUpdated
App\Models\User
roles
[1]
[1 => ['attribute' => 'test']]
许可证
MIT
自由软件,太棒了!