Laravel。观察者向数据透视表添加一个表并立即删除相同的行

问题描述 投票:0回答:1

我有两个模型用户和角色通过数据透视表进行多对多关系。 用户:

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()输出。数组返回正确。

laravel observers laravel-backpack
1个回答
0
投票

您似乎遇到了一个问题,您的 UserObserver 正在向数据透视表添加行,然后删除它们。这可能是由于 Eloquent 的syncWithoutDetaching 方法的工作方式所致。

syncWithoutDetaching 方法通常用于同步相关记录而不分离任何现有记录。在 UserObserver 中,您使用它来同步用户的角色。但是,同步似乎没有按预期工作。

以下是您可以检查和考虑的一些事项:

  1. 检查“all_roles”属性:确保“all_roles”属性 用户模型的正确设置以触发同步操作。如果 设置不正确,可能会导致意外行为。
  2. 检查触发条件:确保观察者处于 在正确的时间触发。如果触发太频繁的话 可能会导致不必要的同步操作。检查如何以及何时 观察者附加到用户模型。
  3. 数据库约束:检查是否存在任何数据库约束或 数据透视表(“role_user_table”)上的触发器可能会干扰 与同步操作。诸如唯一键或外键之类的约束 键可能会影响行为。
  4. 日志记录和调试:您提到返回的数组 syncWithoutDetaching 是正确的。在这种情况下,您可能想要 添加更多日志记录和调试语句来跟踪您的流程 观察者和同步操作。这可以帮助您识别 删除行的确切点。
  5. 替代方法:如果问题仍然存在并且您无法识别 根本原因,您可以考虑采用替代方法 同步角色。例如,您可以手动管理同步 通过将现有角色与新角色进行比较来进行操作 相应地更新数据透视表。

在没有看到完整的代码和数据库结构的情况下,很难查明确切的问题。但是,通过执行这些步骤并仔细检查同步过程,您应该能够识别并解决问题。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.