我看了几个Laracast课程,现在我正在建立我的第一个Laravel项目。我有一些带有时间戳的Eloquent模型,用于created_at和updated_at。
为了显示正确的日期格式,Laravel有一个非常好的功能:访问者。但在每个Eloquent模型中,我现在有两个这样的函数:
public function getUpdatedAtAttribute($value) {
return Carbon::parse($value)->format('d-m-Y H:i:s');
}
public function getCreatedAtAttribute($value) {
return Carbon::parse($value)->format('d-m-Y H:i:s');
}
这样,日期将被强制显示为d-m-Y H:i:s
。唯一的问题是:我不想为我创建的每个模型都这样做。
是否有默认的Laravel方式/约定我可以在全球范围内执行此操作,还是应该制作某种MasterModel
并将其扩展而不是Model
?
答案 0 :(得分:8)
我一直在寻找相同的东西,但遗憾的是无法想出一种创建全球访问者的方法。
dateFormat属性的“问题”是它是一个mutator,而不是一个访问器。扩展基类对于User模型和其他模型都不起作用,因为它扩展了Authenticatable,而不是直接扩展Model。
这是我做的第二件好事 - 我创造了FormatsDates
特质。用你的方法:
trait FormatsDates
{
protected $newDateFormat = 'd-m-Y H:i:s';
public function getUpdatedAtAttribute($value) {
return Carbon::parse($value)->format($this->newDateFormat);
}
public function getCreatedAtAttribute($value) {
return Carbon::parse($value)->format($this->newDateFormat);
}
}
现在我可以在任何我想要的模型上使用这个特性。例如用户模型:
class User extends Authenticatable
{
use FormatsDates;
}
也许有人觉得这很有用。
答案 1 :(得分:5)
首先,您无需提供访问者来更改日期格式。在模型中设置$ dateFormat 变量就足够了,例如:
class User extends Model {
protected $dateFormat = 'U'; // this will give you a timestamp
}
您可以在此处详细了解可用格式:http://php.net/manual/en/function.date.php
其次,如果您不想为所有模型设置 $ dateFormat 变量,请将其设置在那里并使所有模型扩展该类:
class BaseModel extends Illuminate\Database\Eloquent\Model {
protected $dateFormat = 'U';
}
class User extends BaseModel {
...
}