2016-04-14 50 views
1

在我的模型我有函數來設置和獲取時間屬性,像這樣如何覆蓋所有的時間屬性

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

你應該考慮提供開箱即用laravel

在模型中的優秀Carbon包的優點,添加要返回作爲碳實例的$dates陣列的任何字段:

protected $dates = ['created_at', 'updated_at', 'custom_field']; 
現在

當你打電話給你的模型自動返回碳實例,並允許你做這樣的事情:

// 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

沒有簡單的方法在多個字段上對accessor/mutators進行分組。 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; 
}