在不删除(或分离)的情况下更新 Laravel 多对多关系

Updating Laravel ManyToMany Relationship without deleting(or detaching)

目标 - 更新多对多关系但不删除行

假设,用户和角色模型具有多对多关系。一个特定的 $user 具有三个角色 - [1,2,3]表示$user的枢轴table有三行。

现在,我想更新关系。我希望现在的角色是 [1,2,4]。我不想删除 pivot table 上的行(因为这会导致 pivot table 的 ID 出现间隙)。如果我使用 sync([1,2,4]),它将删除与角色“3”对应的行。如果我使用 sync([1,2,4],false),它将保留角色为“3”的行。我希望将角色“3”更新为“4”而不进行任何删除。如何实现?

我知道 detach() 函数,但它再次删除了行。

编辑:问题的来源

如果我在 UserRole 模型之间存在多对多关系,而且用户的 角色通常会不断变化 。那么,继续分离旧角色并附加新角色是否更好? 或者,我应该在不 deleting/detaching 现有行?

我很担心这一点,因为如果我删除一行并添加另一行,'id' 会增加并且在之前的 'id' 的位置有一个间隙。 如果我有数百万用户和数千个角色,'id' 变得越来越大不会给我带来问题吗?

如果它超过整数限制,我知道它不会超过 bigInt 限制(很可能)。没关系。但是我在某处读到,随着 ID 变大,性能变低。

有人可以告诉我这方面的最佳做法吗?

我不会担心在您的数据透视表中删除和添加记录 table。
关于 ID 的大小,maximum value of an unsigned INT in MySQL4'294'967'295。我不相信你会很快达到那个水平。如果您仍然担心,您可以:

  1. 使用无符号 BIGINT(最大 18446744073709551615)
  2. 只需完全删除 ID,在 pivot tables 中通常不需要它。