2016-11-04 104 views
0

我有我的VitalSignSet型號:Laravel 5.3碳日期格式不會在退貨時設置?

class VitalSignSet extends Model 
{ 
    protected $dates = [ 
     'datetimetaken', 
    ]; 

    . . . 
} 

現在在我的功能我有這個函數返回了最新的生命體徵的一組JSON編碼相遇。 (Encounter與VitalSignSet有許多關係)在返回之前,我希望datetimetaken字段的格式可以用於人類可讀性,但僅限於此特定方法。 (這就是爲什麼我沒有使用訪問器)

public function get(Request $request, Encounter $encounter) { 
    // Setting the latest vital sign set 
    $encounter->latest_vitals = $encounter->VitalSignSets() 
      ->orderBy('datetimetaken','desc')->get()->first(); 

    // Formatting the date : 
    // Works when just returning the date. 
    // Does not return in this format when returning the model with the date. 
    $encounter->lastest_vitals->datetimetaken->format('M j, Y'); 

    return $encounter->toJson(); 
} 

上述方法是從js ajax請求訪問的。當我解析並記錄響應時,日期時間格式沒有改變。 (仍然在YYYY-mm-dd H:i:s格式)但是,格式化後我只返回$encounter->latest_vitals->datetimetaken;,字符串以我設置的格式返回。但是當我返回包含VitalSignSet模型$encounter->latest_vitals;(json響應)時,格式爲YYYY-mm-dd。這是爲什麼?

回答

1

這是因爲您只訪問數據對象,實際上並沒有改變它。

不幸的是,我沒有辦法(我已經能夠找到)來編輯模型中Carbon實例的格式。這是因爲Laravel使用相同的格式來解析數據庫中的日期時間,因爲它將它格式化爲字符串。

此外,當Eloquent嘗試並解析該字符串(並失敗)時,您將無法僅將格式化的字符串分配給原始字符串。

的一種方式(如果你想/需要保持鍵datetime)將輸出轉換爲數組,編輯值,然後返回:

$latestVitals = $encounter->VitalSignSets() 
    ->orderBy('datetimetaken', 'desc')->first(); 

$encounter->latest_vitals = collect($latestVitals->toArray()) 
    ->pipe(function ($item) use ($latestVitals) { 
     $item['datetimetaken'] = $latestVitals->datetimetaken->format('M j, Y'); 

     return $item; 
    }); 

return $encounter; 

如果你不這樣做觀念轉變的關鍵,是別的東西(如formatted_datetimetaken),你可以訪問器添加到什麼都模型用於你VitalSignSet:

public function getFormattedDatetimetakenAttribute() 
{ 
    return $this->datetimetaken->format('M j, Y'); 
} 

,然後只用append()

$encounter->latest_vitals = $encounter->VitalSignSets() 
    ->orderBy('datetimetaken','desc') 
    ->first()->append('formatted_datetimetaken'); 

最後,你可以簡單地編輯你的js中的日期時間,如http://momentjs.com/docs。假設您迴應它賦值給變量response

response.latest_vitals.datetimetaken = moment(response.latest_vitals.datetimetaken, "YYYY-MM-DD HH:mm:ss") 
      .format("MMM D, YYYY") 

希望這有助於!