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');
}
}