2016-11-04 6 views
0

나는 나의 VitalSignSet 모델이 있습니다 Laravel 5.3 탄소 (C) 날짜 형식이 반환 될 때 설정되지 않습니까?

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

    . . . 
} 

지금 내 기능에 내가 최신 활력 징후 세트 json으로 인코딩 된 만남을 반환이 기능을 가지고있다. (Encounter에는 VitalSignSet과 hasMany 관계가 있습니다.)하지만 돌아 오기 전에 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 요청에서 액세스됩니다. 구문 분석하고 응답을 기록 할 때 datetimetaken 형식은 변경되지 않았습니다. (여전히 YYYY-mm-dd H:i:s 형식) 그러나 서식을 지정한 후 $encounter->latest_vitals->datetimetaken;을 반환하면 설정 한 형식으로 문자열이 반환됩니다. 그러나 포함 된 VitalSignSet 모델 $encounter->latest_vitals; (json 응답)을 반환하면 형식은 YYYY-mm-dd입니다. 왜 그런가요?

답변

1

데이터 개체에만 액세스하고 있기 때문에 실제로 변경하지 않기 때문입니다.

모델에서 Carbon 인스턴스의 형식을 편집 할 수있는 방법이 없습니다. 이것은 Laravel이 동일한 형식을 사용하여 문자열을 형식화하는 것처럼 데이터베이스에서 datetime을 구문 분석하기 때문입니다.

또한 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'); 

마지막으로 http://momentjs.com/docs과 같은 형식으로 js의 datetime을 편집 할 수 있습니다. 당신의 응답을 가정하면이 변수 response에 할당 :

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

희망이 도움이!