我有两个模型用户和角色通过数据透视表进行多对多关系。 用户:
public static function boot(): void
{
parent::boot();
self::observe(new UserObserver());
}
public function roles(): belongsToMany
{
return $this->belongsToMany(
Role::class,
'role_user_table',
'user_id',
'role_id'
)->using(RoleUser::class);
}
角色用户模型
class RoleUser extends Pivot
{
use CrudTrait;
use HasFactory;
protected $table = 'role_user_table';
public $incrementing = true;
protected $fillable = [
'id',
'user_id',
'role_id',
];
}
用户观察者
public function saved(User $model): void
{
$this->model = $model;
if ($this->model->all_roles) {
$roles= Role::pluck('id')->toArray();
$this->model->roles()->syncWithoutDetaching($roles);
}
}
我在日志(以及临时表中的自动增量)中看到观察者将行添加到数据透视表,然后删除它们。我不明白为什么会发生这种情况。在这种情况下,如果将syncWithoutDetaching的结果保存到变量中并通过dd()输出。数组返回正确。
您似乎遇到了一个问题,您的 UserObserver 正在向数据透视表添加行,然后删除它们。这可能是由于 Eloquent 的syncWithoutDetaching 方法的工作方式所致。
syncWithoutDetaching 方法通常用于同步相关记录而不分离任何现有记录。在 UserObserver 中,您使用它来同步用户的角色。但是,同步似乎没有按预期工作。
以下是您可以检查和考虑的一些事项:
在没有看到完整的代码和数据库结构的情况下,很难查明确切的问题。但是,通过执行这些步骤并仔细检查同步过程,您应该能够识别并解决问题。