这是一个很奇葩问题,并且也困扰了我很久。之前遇到过一次,但当时似乎好像也没有解决,这次接入新的设备再次发现了,总算有时间来论证一番了。

问题比较简单,就是 Laravel 更新模型数据 update 时,字段未更新,但返回 true;听同事的改成 save 也是一样不起作用。

# 简化逻辑之后的 demo
$box = Box::find($id);
if ($box->update([
    'online_status' => 1
])) {

...

代码目标:在接受到设备上报的心跳之后,就更新一下设备在线状态。但反复测试,update 和 save 都没有起作用。文档 基本更新 - Eloquent 入门 里的使用方法反复确认一致,看到单个属性赋值的 save 方法,试了一下,可以更新。

$box = Box::find($id);
$box->online_status = 1;
if ($box->save()) {

...

很奇怪的现象,可想当初应该也是通过这种方法绕过了这个问题。

文档太过简陋,找不到相关的问题解答。没办法,有时不决问百度。

翻阅了百度第一页的教程文档,主要范围两种情况和对应的解决方法:

  • select 字段里没有主键 id,无法确认更新记录
  • 模型中的 $fillable 没有添加相关需要插入或更新的字段

因为 find 是获取所有字段,所以第一种情况不存在。确认模型 $fillable 中确实没有添加在线状态字段,添加后测试有效。

回想当时,应该就是这个 批量赋值 理解有偏差,当时以为是只有批量赋值时才会用到,没想到正常的插入、更新都属于必填的。社区问答里一摸一样的东西 模型的 save () 和 update () 出现偶尔存不了值的情况?,看时间已经是六年前就出现过并解决的,所以下次再遇到奇葩问题,可以现在社区里搜索解答。