如何覆盖所有时间属性

时间:2016-04-14 21:08:11

标签: mysql laravel datetime laravel-4

在我的模型中,我有设置和获取时间属性的功能

  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函数,但我希望有人可以向我展示一个更好的方法,我只需要做一次。在我看来,就像我做错了一样。

2 个答案:

答案 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;
}