在我的模型中,我有设置和获取时间属性的功能
public function setEndTimeAttribute($value)
{
return $this->attributes['end_time'] = date("H:i", strtotime($value));
}
public function getEndTimeAttribute($value)
{
return date("h:i a", strtotime($value));
}
public function setStartTimeAttribute($value)
{
return $this->attributes['start_time'] = date("H:i", strtotime($value));
}
public function getStartTimeAttribute($value)
{
return date("h:i a", strtotime($value));
}
我这样做是因为MySQL需要格式某种方式,我想以不同的格式将其显示给我的用户。我将需要为我所有的时间输入做这件事。
我可以继续为我的模型中的每个属性创建这些get / set函数,但我希望有人可以向我展示一个更好的方法,我只需要做一次。在我看来,就像我做错了一样。
答案 0 :(得分:2)
您应该考虑利用laravel开箱即用的优秀Carbon套餐
在您的模型中,将要作为Carbon实例返回的任何字段添加到$dates
数组中:
protected $dates = ['created_at', 'updated_at', 'custom_field'];
现在,当您调用模型时,它将自动返回Carbon实例并允许您执行以下操作:
// In your controller
...
$user = App\User::find($id);
return view('user', compact('user'));
...
// Then in your view
<p> Joined {{ $user->created_at->diffForHumans(); }} </p>
// output
Joined 8 days ago
答案 1 :(得分:1)
没有简单的方法可以在多个字段上对访问者/变更器进行分组。 Laravel在访问它们时调用它们,这通过获取或设置在每个属性的基础上发生。
但是,如果您在整个模型中有很多具有相似名称(start_time,end_time)的属性,则可能需要考虑使用特征。这样你只需要在模型中使用特征,就可以将所有逻辑保存在一个位置。
示例:
use Carbon\Carbon;
trait TimeFieldsTrait
{
public function formatDisplayTime($value)
{
return Carbon::parse($value)->format('h:i a');
}
public function formatDbTime($value)
{
return Carbon::parse($value)->format('H:i');
}
public function setEndTimeAttribute($value)
{
return $this->attributes['end_time'] = $this->formatDbTime($value);
}
public function getEndTimeAttribute($value)
{
return $this->formatDisplayTime($value);
}
public function setStartTimeAttribute($value)
{
return $this->attributes['start_time'] = $this->formatDbTime($value);
}
public function getStartTimeAttribute($value)
{
return $this->formatDisplayTime($value);
}
}
在你的模型中,你只会使用这个特性......
class YourModel extends Model
{
use TimeFieldsTrait;
}