【问题标题】:Using time field in Eloquent model在 Eloquent 模型中使用时间字段
【发布时间】:2019-06-29 03:51:10
【问题描述】:

我有一个只包含时间的数据库字段,它在我的迁移中声明为

$table->time('time')->default('00:00:00');

现在我想使用 Eloquent 为该字段添加秒数,例如:

$activetime->time->add(new DateInterval('PT5S'));

(其中 $activetime 是 Eloquent 模型的对象)

第一次尝试这个我得到了

Call to a member function add() on string

所以很明显我必须告诉 Eloquent 这不是一个字符串而是一个时间。我得到的最接近的是将它放在模型中受保护的 $dates 中,但后来我得到了

Unexpected data found.

我怀疑这是因为它不是真正的日期,而只是一个时间,但我似乎找不到太多关于如何处理时间的信息。有什么方法可以解决这个问题,或者我最好使用其他东西,比如 dateTime 或时间戳(甚至是秒数的整数)?我想要记录的是用户在给定日期的活动时间,因此为此目的,时间似乎是自然的选择......

【问题讨论】:

  • 你需要什么时间来投稿?你有时间对象吗?
  • 格式化 $activetime->time 然后加上你的秒数。
  • 如果您的模型没有任何其他日期字段,那么您可以将以下内容添加到模型中。 public $timestamps = false; protected $dateFormat = 'H:i:s'; protected $dates = [ 'time', ];
  • 嗯,我有内置的时间戳字段(created_at,updated_at),我猜他们会受此影响?

标签: laravel laravel-5 eloquent laravel-5.7


【解决方案1】:

这是因为 Laravel 将 time 数据库类型读取为 string,而您期待的是 DateTime Object

将此添加到您的 Eloquent 模型中:

public function getTimeAttribute($value)
{
    return new \DateTime($value);
}

您也可以使用 Laravel Attribute Castingtime 转换为 DateTime Object,但您必须在时间上附加一些日期,因为 Laravel 需要正确的格式

【讨论】:

  • 这不只能解决读值的问题吗?我必须做相反的操作才能写作,对吧?无论如何,我想我只是简单地将活动时间保存为秒,而是在输出时进行漂亮的日期格式设置。似乎更容易,因为我缺少用于时间处理的不错的内置函数。
  • @DanielMalmgren 是的,这只是为了读取值。你也可以玩setTimeAttribute来满足你的需求
猜你喜欢
  • 2017-09-19
  • 2013-05-06
  • 2010-11-06
  • 2015-07-21
  • 2018-10-27
  • 2014-10-27
  • 2020-07-11
  • 2020-10-03
  • 2015-05-16
相关资源
最近更新 更多