Laravel Date Mutator需要解析?

问题描述 投票:0回答:1

默认情况下,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检索它时将其转换为一个碳实例?

laravel php-carbon
1个回答
0
投票

这完全取决于$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_atprotected $dates,但请确保它们仍然存在。我不清楚这是否是为了缩短问题的长度,或者您是否实际上已经在代码中完成此操作,但仍需要将该数组正确地转换为该数组。

protected $dates = ["created_at", "updated_at", "deleted_at", ...];
© www.soinside.com 2019 - 2024. All rights reserved.