一尘不染

在Laravel中使用时间戳计算两个日期之间的差异

sql

我的表中有一个带有created_at和updated_at的时间戳记

$table->timestamps();

但是我想添加另一列以天为单位来计算created_at和updated_at之间的差异

我应该在SQL还是在控制器中执行此操作?


阅读 341

收藏
2021-05-16

共1个答案

一尘不染

您可以从Eloquent模型中做到这一点。假设您的模型名为User。您可以通过定义创建一个计算字段访问器

class User extends Model 
{
  $dates = [
    'updated_at',
    'created_at'
  ];
  $appends = ['diffInDays'];

  public function getDiffInDaysAttribute()
  {
    if (!empty($this->created_at) && !empty($this->updated_at)) {
      return $this->updated_at->diffInDays($this->created_at);
    }
  }
}

一些解释

通过添加created_atupdated_at$dates数组,Laravel自动将您的日期值转换为Carbon。现在,如果执行类似的操作$user->created_at,则不会得到字符串,而是该日期的Carbon实例。这样您就可以进行一些不错的日期计算,例如上面的计算。

通过添加带有此getDiffInDaysAttribute功能的访问器$user->diffInDays,尽管模型中没有此属性,但您可以通过像普通属性一样调用日期差。

但是,如果您现在要做类似的操作$user->toArray(),则该diffInDays属性将不可用。要在获取用户数据时总是增加天数差异,可以将字段添加到$appends数组中。这样,当您通过Eloquent检索用户数据时,将始终返回该字段。

2021-05-16