请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Category protected $autoWriteTimestamp = true; 不写

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回答

在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 回复 有任何疑惑可以回复我~
  • 非常感谢!
    回复 有任何疑惑可以回复我~ 2020-04-29 22:39:44
  • 你上面的写法有什么不同??
    不都是使用模型吗??
    使用db不是这样吗:Db::name('user')->where(['id'=>1])->save(['sex'=>1]);
    回复 有任何疑惑可以回复我~ 2020-10-08 10:41:13
  • 虽然使用起来差不多,但是细节上是有区别的,你可以理解为你使用了模型他是要是继承think\model类,该类里面会定义许多默认属性和配置,而你使用db继承的是think\Db
    这位同学推荐学一下singwa老师的tp源码课程,里面的第七章清楚的讲解了db操作类和模型
    回复 有任何疑惑可以回复我~ 2020-10-08 11:32:54
天经地义 2020-04-27 09:57:55

看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 回复 有任何疑惑可以回复我~
  • 这里已经设置自动更新为true;但是update的时候没有更新update_time字段;
    回复 有任何疑惑可以回复我~ 2020-04-27 11:16:11
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信