小心 Laravel 中的 Model::increment #3053
limingxinleo
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
Laravel v5.4.18 中的一个提交,导致的 BUG,因为添加了错误的单测,导致没办法轻易修改,这里提醒大家,使用时需要谨慎,以免采坑。
commit
pr#35748
Hyperf 框架中已经解决了以下问题
相关PR
BUG 重现
1. increment extra 后再进行 save 操作,会执行两句SQL
我们先写一段没有 extra 数据的代码,进行测试
通过测试得知,以上代码只会生成两段 SQL,分别是
然后让我们修改测试代码
这时,会生成以下三段 SQL
且第二段和第三段 SQL 中,str 的值是一致的。这个问题的主要原因,便是 extra 里的数据不会被同步到 original 中,就导致第二次 save 计算 dirty 的时候,出现了BUG。
2. getChanges 表现不一致
经过第一个 BUG 的重现,那么第二个问题也就很容易想到了,就是 getChanges 方法。
让我们继续编写代码测试
以上代码会输出以下数据,可见还是符合预期的
让我们继续修改代码,在
increment
前增加一次赋值会得到以下输出
看似没有问题,但让我们检查一下 SQL
却发现,并没有修改 str 的数据,那显然 getChanges 与预期不符。
实际上,increment 在设计上,并没有想要修改前面 setter 的数据,但这种情况下,我们 getChanges 便也不能把 str 算进来。
让我们继续修改代码
两次 getChanges 输出如下
可见两次 getChanges 中,str 的值是一致的。
输出的 SQL 如下
Beta Was this translation helpful? Give feedback.
All reactions