Laravel timestamps 设置为unix时间戳

2014.10.23

相信对于 Laravel 提供了自动的 timestamps 使用起来一定让大家很开心吧!

只要大家在数据库表中创建了 craeted_atupdated_at 字段之后, Laravel 已经准备好了给你提供各种服务了 ^^。比如说,模型继承了 Eloquent 之后,便会在 $model->save() $model->update() $model->push() $model->touch() 的时候更新时间戳字段。对,全自动,一切都给你搞定了,真的很爽。

当然,禁止它们这种体贴的行为很简单,只要在继承的模型里面这样写就可以了

class User extends Eloquent {

    public $timestamps = false;

}

嗯,设置 $timestamps = false 既可。

可是,这么好用的,堪称完美的功能为什么不用呢?为什么呢?我也很纳闷。
呃,难道因为它是标准的日期时间类型吗?而你喜欢在项目里面用上分分钟都无法计算出来哪一天的unix时间戳?
好吧,你说这是因为老项目数据库的原因,原谅你一回。下面就告诉你怎么搞定它,让它如你所愿,好让你爽到爆!

class BaseModel extends Eloquent {

    /**
     * 默认使用时间戳戳功能
     *
     * @var bool
     */
    public $timestamps = true;

    /**
     * 获取当前时间
     *
     * @return int
     */
    public function freshTimestamp() {
        return time();
    }

    /**
     * 避免转换时间戳为时间字符串
     *
     * @param DateTime|int $value
     * @return DateTime|int
     */
    public function fromDateTime($value) {
        return $value;
    }

    /**
     * select的时候避免转换时间为Carbon
     *
     * @param mixed $value
     * @return mixed
     */
//  protected function asDateTime($value) {
//      return $value;
//  }

    /**
     * 从数据库获取的为获取时间戳格式
     *
     * @return string
     */
    public function getDateFormat() {
        return 'U';
    }

}

你可以会注意到了我这里注释掉了 asDateTime 这个方法。在这里,我想在模型对象读取这两个字段的时候输出的是标准的日期时间字符串,这样的话我就可以省点力去转换了。

如果你想只获取日期的话,可以用这样的姿势获得结果:

$model->created_at->format('Y-m-d')

还有,注意啊,你的数据库字段一定别再是 datetime 了,换成 int 型吧。

静静享受 Laravel 自动维护 timestamps 带给你的方便吧!

Comments
Write a Comment