2017-11-28 19 views
0

내가 JSON으로이 모델을 반환 할 때, 나는 다시 다음 얻을 두 개의 데이터 속성, allowance_starts_atallowance_ends_at이있는 조직 모델을 가지고 :Laravel 오버라이드 (override)/날짜를 추가 한 속성은 JSON 출력에 연재되지 않습니다

allowance_starts_at: "2017-06-01 00:00:00", 
allowance_ends_at: "2018-05-31 23:59:59", 

allowance_starts_at: "2018-06-01 00:00:00", 
allowance_ends_at: "2019-05-31 23:59:59", 

내가 무시하고있어이를 달성하기 :

그러나 나는 내가 속성 반환 할 2018년 6월 1일 와서 현재 연도 (또는 허용 기간)로 해 설정 이러한 특성을 무시하려면 s와 같은 모델의 속성 오 : 나는 탄소 날짜는 직렬화 된 JSON으로 모델

이 작동하고 난 지금, 그러나 원하는 나에게 결과를 제공
public function getAllowanceStartsAtAttribute($value) 
{ 
    $currentYear = Carbon::now()->format('Y'); 
    $d = Carbon::createFromFormat('Y-m-d H:i:s', $value); 
    $d->year($currentYear); 

    return $d; 
} 

public function getAllowanceEndsAtAttribute($value) 
{ 
    $d = Carbon::createFromFormat('Y-m-d H:i:s', $value); 

    if ($d->copy()->subYear()->addSecond() != $this->allowance_starts_at) { 
     $d->addYear(); 
    } 

    return $d; 
} 

없는 출력 할 때 :

allowance_starts_at: { 
    date: "2017-01-01 00:00:00.000000", 
    timezone_type: 3, 
    timezone: "Europe/London" 
}, 
allowance_ends_at: { 
    date: "2017-12-31 23:59:59.000000", 
    timezone_type: 3, 
    timezone: "Europe/London" 
}, 

또한 이것을 테스트했습니다 추가 된 속성 때문에 기존 속성을 덮어 쓰지 않고 단지 Carbon::now()을 반환 한 추가 속성을 만들고 $ dates 배열에 추가 속성을 설정하면 같은 방식으로 출력됩니다. 즉 직렬화되지 않습니다.

Laravel이 특성을 출력하는 방법을 결정하는 사람이 있습니까? 탄소 또는 문자열로?

누구나 내가이 작업을 어떻게 할 수 있는지 알고 있습니까?

업데이트


감사 폴. 세터 뮤 테이터를 사용하여 필자에게 필요한 행동을 주었다. 나는 내 최우선의 방법을 대체 :

public function setAllowanceStartsAtAttribute($value) 
{ 
    $currentYear = Carbon::now()->format('Y'); 
    $value->year($currentYear); 

    $this->attributes['allowance_starts_at'] = $value; 
} 

public function setAllowanceEndsAtAttribute($value) 
{ 
    if ($value->copy()->subYear()->addSecond() != $this->attributes['allowance_starts_at']) { 
     $value->addYear(); 
    } 

    $this->attributes['allowance_ends_at'] = $value; 
} 

을 그리고 JSON을 반환 할 때 지금은이 출력을 얻을 :

allowance_starts_at: "2018-06-01 00:00:00", 
allowance_ends_at: "2019-05-31 23:59:59", 
+0

'$ d'는 Carbon 객체이고, Carbon은 JSON으로 출력을위한 네이티브 처리 기능을 가지고 있습니다. 2019-05-31 23:59:59 "와 같은 출력을 원하면'return $ d' 대신에'return $ d-> toDateTimeString();'을 사용하십시오. – ceejayoz

+0

네,하지만 모델이 내부적으로 사용되는 경우 Carbon 인스턴스가 필요하고 toDateTimeString 출력은 JSON에서만 필요합니다. Laravel은 created_at, updated_at 또는 $ dates 배열에 설정 한 다른 날짜에 대해 자동으로 처리하지만이 작업은 데이터베이스에 저장된 날짜에만 작동하며 모델 자체의 특성으로 설정된 날짜에는 작동하지 않는 것으로 보입니다. –

+0

잔인 함처럼 보이지만 API 리소스가 효과적 일 수 있습니다. – Nartub

답변

0

당신이 뮤 테이터를 사용하여 시도? getAllowanceEndsAtAttribute 대신 setAllowanceEndsAtAttribute를 만드시겠습니까?