Category protected $autoWriteTimestamp = true; 不写

来源:8-9 后端排序功能开发以及之前代码优化工作

架构师是怎样炼成de

2020-04-26

Category protected $autoWriteTimestamp = true; 不写 $data[‘update_time’] = time();
Category 这里设置了 autoWriteTimestamp ,
但是没有自动更新 update_time字段,

  public function updateById($id, $data)
    {
        // $data['update_time'] = time();
        return $this->where(['id' => $id])->save($data);
    }

为啥没有自动更新该字段,而需要单独写出

写回答

2回答

天经地义

2020-04-27

在TP中,模型的方法写入数据可以设置自动更新时间戳,如果用的是Db的方法是不行的:

假如你新增数据这样写:

$this->save(['sex' => 1]);

假如你更新数据:

$this->where('id',1)->save(['sex' => 1]);

上面这样写是不会自动更新时间戳的

$obj = $this->where('id',1)->find();
$obj->sex = 1;
$obj->save();

这样写才行

0
6
小广陵
回复
天经地义
你这解释是有问题的,只是你这个解决方案恰好蒙对了,这三个其实都是model里save方法,只是框架内部有机制通过是否先查询出来来区分新增和修改,源码里区分的依据是exists属性,我这里给的建议是新增用$this->create($data),更新用$this->update($data,[id=>$id]),源码里update方法设置了exists属性为true从而加以区分
2020-12-09
共6条回复

天经地义

2020-04-27

看TP6源码\vendor\topthink\think-orm\src\Model.php的591行处,updateData方法

if ($this->autoWriteTimestamp && $this->updateTime && !isset($data[$this->updateTime])) {
    // 自动写入更新时间
    $data[$this->updateTime]       = $this->autoWriteTimestamp($this->updateTime);
    $this->data[$this->updateTime] = $data[$this->updateTime];
}

$this->autoWriteTimestamp是是否默认更新时间戳,如果你不赋值是默认为false的,if里面的逻辑就进不去,$this->updateTime就是定义你更新时间戳的字段名,默认为“update_time”


创建数据时create_time和update_time自动填写的逻辑在655行的insertData方法

0
1
架构师是怎样炼成de
这里已经设置自动更新为true;但是update的时候没有更新update_time字段;
2020-04-27
共1条回复

全流程开发 TP6.0实战高并发电商服务系统

一课就能掌握TP6.0基础及运用,打造完整高并发的电商后端项目

1458 学习 · 1310 问题

查看课程