2013-08-23 30 views
2

我在我的數據庫中創建了一些datetime字段,正如Laravel文檔中所述,我可以「自定義哪些字段會自動發生變化」。但是沒有示例顯示如何完成,也沒有任何搜索結果。我應該怎樣做某些領域的自動變異?如何在Laravel中自定義日期增變器?

例如,我創建了一個名爲「人」的遷移,表中的一個字段被定義爲這樣的:

class CreatePeopleTable extends Migration { 
    public function up(){ 
    Schema::create("bookings",function($table){ 
     ... 
     $table->dateTime("birthday"); 
     ... 
    } 
    } 
} 

我定義的模型在模型的「人」:

class People extends Eloquent{ 
    //nothing here 
} 

如果我指的是一個人實例的生日,這將是字符串,而不是日期時間

$one=People::find(1); 
var_dump($one->birthday); 
//String 

日期增詞器應該能夠直接將其轉換爲碳對象,但文檔沒有多說它應該如何實現。

回答

5

根據這一doc,您可以使用模型成員函數getDates()定製其的Fileds自動突變,所以下面的例子將返回碳實例,而不是字符串:

$one = People::find(1); 
var_dump($one->created_at);//created_at is a field mutated by default 
//Carbon, which is a subclass of Datetime 

但它沒有說清楚如何添加自己的字段。我發現了getDates()方法返回一個字符串數組:

$one = People::find(1); 
echo $one->getDates(); 
//["created_at","modified_at"] 

那麼,你所能做的就是附加字段名這個方法的返回值:

class People extends Eloquent{ 
    public function getDates(){ 
     $res=parent::getDates(); 
     array_push($res,"birthday"); 
     return $res; 
    } 
} 

現在birthday場將被退回因爲當你把它叫做碳例如:

$one = People::find(1); 
var_dump($one->birthday); 
//Carbon 
3

你是什麼意思:自動變異?

如果您的意思是在從數據庫使用Accessors和Mutators(Laravel文檔)中檢索後發生了變異。

添加到您的模型:

public function getDateAttribute($date) 
{ 
    // modify $date as you want, example 
    // $date = new \Carbon\Carbon($date); 
    // $date->addDay() 
    // return (string)$date 
} 
16

在你的人的模型只需添加此陣:

protected $dates = array('birthday'); 

Laravel's Model。PHP internaly合併的領域以及默認這樣的:

/** 
    * Get the attributes that should be converted to dates. 
    * 
    * @return array 
    */ 
    public function getDates() 
    { 
     $defaults = array(static::CREATED_AT, static::UPDATED_AT, static::DELETED_AT); 

     return array_merge($this->dates, $defaults); 
    } 
+1

或者,簡化'return $ defaults + $ this-> dates' –

+1

getDates是一個核心Laravel方法,但隨意建議通過拉請求更改爲泰勒;) –