记一次错误使用 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
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 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年前 评论

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