Laravel 修改数据与原数据一样 导致没有执行sql
代码
$openid = "123"; // 微信openid
User::WhereIn("id",['1','2','3'])->update([
'openid' => $openid
]);
$user = User::find(1);
// 取消所有这个openid的绑定者
User::Where(['openid' => $openid])->update([
'openid' => null
]);
// 给1号用户绑定openid
$user->openid = $openid;
$user->save();
问题: openid = 123 有几个?
答案: 一个都没有。
原因

getDirty 会返回 $user 的 original(查询出来的 不允许改变) 和 attributes(手动赋值的) 不同的地方,
最后发现属性都一样,所以 $user->save() 不会执行修改。
扯淡
写 微信绑定 的时候发现不对劲,还以为是 laravel 或者 mysql的 bug 
当然
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
看着没有什么问题,这个时候封装的必要性就体现出来了。这个$user变量就不该全局存在
也就是都是null
ORM都是这样的吧,修改的时候逐一对应原数据库的值和变量的值,只修改对比出的差异字段。
要解决的话可以在上面的where条件增加限定
->where('id', '!=' 1),此处不等于会走索引,倒是问题也不大。另一种方法可以考虑改变ORM内的原始值
建议在开发环境中使用
Listerer监听 SQL,这样查找问题会快很多,而且还可以发现查询的时候忘记使用with导致循环查询的问题。fillable中设置openid了吗