【问题标题】:Updating Laravel ManyToMany Relationship without deleting(or detaching)在不删除(或分离)的情况下更新 Laravel 多对多关系
【发布时间】:2015-01-26 03:21:39
【问题描述】:

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

假设,用户和角色模型具有多对多关系。一个特定的$user 具有三个角色 - [1,2,3]。它表示此$user 在数据透视表中有三行

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

我知道detach() 函数,但这又会删除行。

编辑:问题的起源

如果我在UserRole 模型之间存在多对多关系,并且通常用户的角色会不断变化。那么,继续分离旧角色并附加新角色更好吗?或者,我应该更新数据透视表现有行上的role_id,而不删除/分离现有行?

我对此感到担忧,因为如果我删除一行并添加另一行,'id' 会增加,并且之前的'id' 会出现差距。 如果我有数百万用户和数千个角色,那么“id”变大不会给我带来麻烦吗?

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

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

【问题讨论】:

  • 我认为您不应该真正担心数据透视表中的 ID。这种担忧背后的原因是什么?
  • @lukasgeiter 如果它们变得太大并在以后出现性能问题怎么办?如果某个时候(不是在不久的将来)它们超过整数限制怎么办?我只是想知道它的最佳实践。

标签: php laravel laravel-4 eloquent


【解决方案1】:

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

  1. 使用无符号 BIGINT(最大 18446744073709551615)
  2. 只需完全删除 ID,数据透视表中通常不需要它。

【讨论】:

  • 假设,我不遵循第二个选项,随着 ID 变大会不会出现性能问题?
  • 我并不是真正的数据库专家,但据我所知,使用 BIGINT 会影响性能,但数字的实际大小并不重要。这意味着如果您的记录的 ID 为 0-1000 或 10000-11000 不会改变任何东西。我认为您真的可以坚持使用普通的无符号 INT。 如果你的应用程序恰好被使用了这么多,你以后仍然可以做一些事情......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 2013-09-26
  • 2016-03-14
  • 2013-03-15
相关资源
最近更新 更多