2017-09-22 4 views
0

나는 아이들을 hasMany의 부모가 : parent_idvalue :json으로 변환 할 때 관계를 수정하는 방법은 무엇입니까?

class Parent extends Model 
{ 
    public function children() 
    { 
     return $this->hasMany(Child::class); 
    } 
} 


class Child extends Model 
{ 
    public function parent() 
    { 
     return $this->belongsTo(Parent::class); 
    } 
} 

하위 모델 만이 특성을가집니다. JSON으로 부모를 변환 할 때 대신

{ 
    "name": "name1", 
    "children": [ 
    { 
     "value": "value1" 
    }, 
    { 
     "value": "value2" 
    } 
    ] 
} 

내가

{ 
    "name": "name1", 
    "children": [ 
    "value1", 
    "value2" 
    ] 
} 

를 얻을 나는이 새로운 getValuesAttribute를 선언하고 부모에 protected $appends = ['values'];을 추가하여 수행 할 수 있다는 것을 알 수 있도록 내가 값을 "따"할 모델하지만 속성의 이름을 바꾸지 않고 그렇게하고 싶습니다. (값이 children 배열이고 values 배열이 아님). 관계와 같은 이름의 뮤 테이터 속성을 정의하면 분명히 오류가 발생합니다.

어떻게하면됩니까?

답변

0

한 가지 방법은 Fractal을 사용하여 모델에서 데이터 표현을 분리하는 것입니다. 원하는 구조에 맞게 Fractal 변환기를 정의하면 컨트롤러의 변환기에 데이터를 전달하고 모델을 만지지 않고도 JSON의 구조를 변경할 수 있습니다.

편집 : Laravel 5.5는 resources을 도입했는데, 이는 Fractal의 가장 간단한 대안이지만 기본적으로 동일한 작업을 수행합니다.

public function jsonSerialize() 
{ 
    return [ 
     'name' => $this->name, 
     'children' => $this->children->pluck('value')->toArray(), 
    ] 
} 

toJson()를 호출 할 때 올바른 출력을 받게됩니다 이렇게 :

$parent->children = $parent->children->pluck('value'); 

return $parent->toJson(); 
0

메서드를 호출하거나 모델을 json 응답으로 반환 할 때 (내부적으로 toJson().

0

당신은 당신을 Parent 모델을 jsonSerialize 함수를 재정의 할 수 : 당신이 그런 짓을한다면 어떤