在不删除(或分离)的情况下更新 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()
函数,但它再次删除了行。
编辑:问题的来源
如果我在 User
和 Role
模型之间存在多对多关系,而且用户的 角色通常会不断变化 。那么,继续分离旧角色并附加新角色是否更好? 或者,我应该在不 deleting/detaching 现有行?
我很担心这一点,因为如果我删除一行并添加另一行,'id'
会增加并且在之前的 'id'
的位置有一个间隙。 如果我有数百万用户和数千个角色,'id' 变得越来越大不会给我带来问题吗?
如果它超过整数限制,我知道它不会超过 bigInt 限制(很可能)。没关系。但是我在某处读到,随着 ID 变大,性能变低。
有人可以告诉我这方面的最佳做法吗?
我不会担心在您的数据透视表中删除和添加记录 table。
关于 ID 的大小,maximum value of an unsigned INT in MySQL 是 4'294'967'295。我不相信你会很快达到那个水平。如果您仍然担心,您可以:
- 使用无符号 BIGINT(最大 18446744073709551615)
- 只需完全删除 ID,在 pivot tables 中通常不需要它。
目标 - 更新多对多关系但不删除行
假设,用户和角色模型具有多对多关系。一个特定的 $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()
函数,但它再次删除了行。
编辑:问题的来源
如果我在 User
和 Role
模型之间存在多对多关系,而且用户的 角色通常会不断变化 。那么,继续分离旧角色并附加新角色是否更好? 或者,我应该在不 deleting/detaching 现有行?
我很担心这一点,因为如果我删除一行并添加另一行,'id'
会增加并且在之前的 'id'
的位置有一个间隙。 如果我有数百万用户和数千个角色,'id' 变得越来越大不会给我带来问题吗?
如果它超过整数限制,我知道它不会超过 bigInt 限制(很可能)。没关系。但是我在某处读到,随着 ID 变大,性能变低。
有人可以告诉我这方面的最佳做法吗?
我不会担心在您的数据透视表中删除和添加记录 table。
关于 ID 的大小,maximum value of an unsigned INT in MySQL 是 4'294'967'295。我不相信你会很快达到那个水平。如果您仍然担心,您可以:
- 使用无符号 BIGINT(最大 18446744073709551615)
- 只需完全删除 ID,在 pivot tables 中通常不需要它。