记一次错误使用 laravel 模型的 updated_at

有个表的数据需要拉取接口来更新同步,原本设想的是每次调用模型的 save 方法会更新 updated_at ,实际上如果数据没有变化,updated_at 是不变的..

尤其以 updated_at 做为缓存时间判断的,要注意。

class Test extends Model {
    public static function autoUpdateGet($uid) {
        $expire = 3 * 3600; // 3小时更新一次

        $test = self::where('uid', $uid)->first();

        if (time() - strtotime($test->updated_at) < $expire) {
            return $test;
        }

        //name不发生变化,updated_at字段不会变化,一直会走这段代码
        $data = curl('xxx');
        $test->name = $data['name'];
        $test->save();
        return $test;
    }
}

改为

$test->name = $data['name'];
$test->updated_at = date('Y-m-d H:i:s',time());
$test->save();
welcome come back
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7
class Test extends Model {
    public function autoUpdateGet($uid) {
        ...

        //name不发生变化,updated_at字段不会变化,一直会走这段代码
        $data = curl('xxx');
        $test->touch();  // 如果只更新 updated_at ,直接使用 touch 方法,开发者已经帮你想到这个问题了。
        return $test;
    }
}
2年前 评论
php_yt (楼主) 2年前
陈先生

实际上如果数据没有变化,updated_at 是不变的.., 那么请问 没更新的数据需要记录更新时间吗?

$model->isDirty();

了解一下上面的这个函数

2年前 评论
php_yt (楼主) 2年前
陈先生 (作者) 2年前

created_at和updated_at最初的作用是用于给DBA操作的,建议业务上不要用这两个字段做特殊处理。

2年前 评论

其实还有一个办法就是每次save之前强制复制updated at 字段最新值即可

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!