Php “支点”;删除“;删除父项时发生的事件

Php “支点”;删除“;删除父项时发生的事件,php,laravel,Php,Laravel,我有两种型号:用户和角色 一个用户可以有许多角色 一个角色可以有多个用户 我在这两个模型之间有一个自定义枢轴模型。此自定义pivot模型之所以存在,是因为它使用了一种特性来侦听/记录事件,例如创建的,更新的,删除的 假设我有一个名为主持人的角色。当我将该角色attach()(或detach())分配给5个用户时,它会成功地为数据透视表触发5个创建的(或删除的)事件 $roleModerator->users()->attach($anarrayofficeusershere); 到目前为止还不

我有两种型号:
用户
角色

一个用户可以有许多角色

一个角色可以有多个用户

我在这两个模型之间有一个自定义枢轴模型。此自定义pivot模型之所以存在,是因为它使用了一种特性来侦听/记录事件,例如
创建的
更新的
删除的

假设我有一个名为
主持人的角色。当我将该角色
attach()
(或
detach()
)分配给5个用户时,它会成功地为数据透视表触发5个
创建的
(或
删除的
)事件

$roleModerator->users()->attach($anarrayofficeusershere);
到目前为止还不错

我的问题如下:当我删除
主持人
角色本身时,它会删除与该角色关联的所有透视行,但不会为每个删除的透视行触发任何
已删除
事件

预期行为:当我要求Laravel删除角色时,我希望它在透视表中删除的每一行都触发
deleted
事件

环境:PHP7.3/Laravel6

我注意到一件奇怪的事情,如果我将此添加到我的
角色中
模型:

公共静态函数boot()
{
父::boot();
静态::删除(函数(self$模型)
{

//$model->users()->detach();//where('role_id',$model->id)->get()->each->delete();//users()->sync([]);//不能100%确定它是否适用于您的情况,但根据,您需要在模型中进行一些设置

首先,确保表中有一个主键列,并在透视模型上定义


因此,如果您的
static::deleting()
方法中没有任何内容,那么透视表记录是否仍保留在那里?我猜
$model->users()->detach();
实际上什么都没有做,因为detach()方法应该接受一个ID数组(如第110行的屏幕截图所示)。如果记录被删除,并且没有触发任何事件,则可能您的数据库的外键设置为ON_DELETE=CASCADE,因此它们在数据库级别被删除,这是laravel无法检测到的…很可能只是一个想法:)如果我的
static::deleting()中没有任何内容
方法,透视表记录仍然会在删除角色本身的同时被删除。我确实对delete有一个级联约束,即delete
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
所以要回答为什么sync()会触发事件而detach()不是,这是因为您需要将id传递到detach()方法才能工作。因此您可以获得所有id,如
$IDs=$model->users()->pulk('id')->toArray()
,然后
$model->users()->detach($IDs);
(我的语法可能有点错误,但希望您能理解)。这将使您的detach方法触发事件。是的,事件没有首先触发的原因是MySQL正在级联删除它们,而Laravel无法检测到:)
//从用户中分离所有角色…$user->roles()->detach()
在我决定提问之前,我也通过GG在GH上发现了这个问题。遗憾的是,这没有什么用处。我非常怀疑这很重要,但也许我应该指出这是一个由许多人变形的关系。Pivot扩展了
变形Pivot
。可能有助于将模型中的相关代码添加到问题中,尤其是关联关系。另一个选项可能是使用模型的
boot()
方法来执行所有需要执行的操作(触发事件、删除关系等)
<?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');
    }
}