默认情况下,Eloquent会将created_at和updated_at列转换为Carbon实例。检索$ dates属性中列出的属性时,它们将自动强制转换为Carbon实例,从而使您可以在属性上使用Carbon的任何方法。
我在dates属性中具有以下内容-我没有包括created_at和updated_at列,因为这些列是根据上述默认转换的。
protected $dates = ['deleted_at'];
然后,我在模型上具有以下访问器:
public function getCreatedAtAttribute($datetime)
{
return $datetime->timezone('Europe/London');
}
但是以上情况引发以下错误:
Call to a member function timezone() on string
如果我将方法更改为以下方法,它将起作用:
public function getCreatedAtAttribute($datetime)
{
return Carbon::parse($datetime)->timezone('Europe/London');
}
问题是为什么我需要解析它,因为它是根据docs https://laravel.com/docs/6.x/eloquent-mutators#date-mutators检索它时将其转换为一个碳实例?
这完全取决于$datetime
是什么,以及此函数如何传递它。显然,它是string
实例,而不是Carbon
实例,但是您没有在问题中包括$datetime
的定义,因此我只能推测。
话虽如此,但我没有看到使用外部变量的变异子,因为它们通常被设计为通过$this
来访问您要应用它们的类的属性:
public function getCreatedAtAttribute(){
return $this->created_at->timezone('Europe/London');
}
我唯一可以看到的警告是尝试使用$model->created_at
时命名冲突。它应该处理它,但是如果遇到问题,可能需要通过getCreatedAtTzAttribute()
之类的东西$model->created_at_tz
进行访问。
[另外,您说您已经从created_at
中省略了updated_at
和protected $dates
,但请确保它们仍然存在。我不清楚这是否是为了缩短问题的长度,或者您是否实际上已经在代码中完成此操作,但仍需要将该数组正确地转换为该数组。
protected $dates = ["created_at", "updated_at", "deleted_at", ...];