Laravel 5.8 应该调度同步,附加和分离事件(https://laravel.com/docs/5.8/releases搜索中间表/数据透视模型事件部分)。
更新:发布此问题后已更新发行说明(更多信息:https://github.com/laravel/framework/issues/28050-https://github.com/laravel/docs/pull/5096)。
我尝试了一下,但是以下代码引发了异常:
调用未定义的方法App \ ProjectUser :: syncing()
注意:由于Laravel 5.8应该调度同步事件,所以我不想使用外部程序包。
class User extends Model
{
public function projects()
{
return $this->belongsToMany(\App\Project::class)->using(\App\ProjectUser::class);
}
}
class Project extends Model
{
public function users()
{
return $this->belongsToMany(\App\User::class)->using(\App\ProjectUser::class);
}
}
class ProjectUser extends Pivot
{
public static function boot()
{
parent::boot();
static::syncing(function ($item) {
dd('syncing event has been fired!');
});
}
}
// web.php
$project = \App\Project::first();
$project->users()->sync([1,2]);
我试图将引导方法从ProjectUser
移到User
和Project
,但是我遇到了同样的异常。
答案 0 :(得分:1)
如果调用的分离方法不带ID(用于分离所有关系),则事件不会触发
https://github.com/laravel/framework/pull/27571#issuecomment-493451259
我尝试了许多不同的方法来解决此需求,但是如果不使用外部包或重写许多方法是不可能的。
我选择chelout/laravel-relationship-events包裹。
看起来干净而不稳定。并与特征一起使用。
答案 1 :(得分:0)
在Laravel 5.8上,当您使用方法sync
,attach
或detach
时,将触发相应的模型事件(创建,更新,保存,...)对于所谓的动作。请注意,使用sync
,attach
或detach
不会触发任何事件,例如同步,附加或分离。
更具体地说,为传递给sync
方法的每个元素触发的事件顺序是:
为传递给attach
方法的每个元素触发的事件顺序为:
为传递给detach
方法的每个元素触发的事件顺序为:
因此,如果您要观察同步操作,则实际上必须观察保存(或保存)事件:
class ProjectUser extends Pivot
{
public static function boot()
{
parent::boot();
static::saving(function ($item) {
// this will die and dump on the first element passed to ->sync()
dd($item);
});
}
}
工作示例https://github.com/danielefavi/laravel-issue-example
有关此问题的更多信息https://github.com/laravel/framework/issues/28050
发行说明具有误导性,并且已对其进行了https://github.com/laravel/docs/pull/5096的更改。