поворотное «удаленное» событие при удалении родителя - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть 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() сама!

enter image description here

1 Ответ

0 голосов
/ 27 февраля 2020

Не на 100% уверен, что это применимо к вашей ситуации, но в соответствии с этой проблемой на Github , вам необходимо выполнить некоторые настройки в ваших моделях.

Во-первых, убедитесь, что у вас есть столбец первичного ключа в вашей таблице и он определен в вашей сводной модели.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\Pivot;

class MyCustomPivot extends Pivot
{
    public $primaryKey   = "id";
    public $incrementing = true;
}

Во-вторых, убедитесь, что вы включили свою пользовательскую сводную модель в ваши отношения.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class)
            ->using(MyCustomPivot::class)
            ->withPivot('id');
    }
}

class User extends Model
{

    public function roles()
    {
        return $this->belongsToMany(Role::class)
            ->using(MyCustomPivot::class)
            ->withPivot('id');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...