У меня есть 2 модели: User
и Role
.
У пользователя может быть много ролей.
Роль может иметь много пользователей.
У меня есть пользовательская модель разворота между этими двумя моделями. Эта пользовательская сводная модель существует только потому, что она использует черту, которая прослушивает / регистрирует такие события, как created
, updated
, deleted
.
Допустим, у меня есть роль с именем moderator
. Когда я attach()
(или detach()
) эту роль для 5 пользователей, он успешно запускает 5 created
(или deleted
) событий для сводной таблицы.
$roleModerator->users()->attach($anArrayOfFiveUsersHere);
Пока все хорошо .
Моя проблема заключается в следующем: когда я удаляю саму роль moderator
, она удаляет все строки сводки, связанные с ролью, но не запускает событие deleted
для каждой удаленной строки сводки.
Ожидаемое поведение: я хочу, чтобы Laravel запускал deleted
событий для каждой строки, которые он удаляет в сводной таблице, когда я прошу его удалить роль.
Среда: PHP 7.3 / Laravel 6
Одна странная вещь, которую я заметил, если я добавлю это к моей Role
модели:
public static function boot()
{
parent::boot();
static::deleting(function (self $model)
{
//$model->users()->detach(); // <-- this fails firing deleted events.
//MyCustomPivot::query()->where('role_id', $model->id)->get()->each->delete(); // <-- this fails firing deleted events.
$model->users()->sync([]); // <--- this works!
});
}
sync([])
будет отлично работать и уволит столько же deleted
события, поскольку он удаляет сводные строки.
, но detach()
, хотя и выполняет то же самое, не будет запускать любое событие deleted
. Это почему? Они оба из InteractisWithPivotTable.php
и sync()
даже звонит detach()
сама!