2017-09-22 14 views
0

は私が子供たちをhasManyの親を持っている:parent_idvaluejsonに変換する際に関係を変更する方法は?

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


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

子モデルのみ2属性があります。私はそれが新しいgetValuesAttributeを宣言し、親にprotected $appends = ['values'];を追加することによって達成することができることを知っているJSONに親を変換するときに代わりに

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

の私は

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

を得るように、値を「摘む」にしたいです私は値をchildrenの配列にし、valuesの配列ではないようにしたい)属性の名前を変更せずにそのようにしたい。私がmutator属性をrelationと同じ名前で定義すると、明らかにエラーが発生します。

どうすればいいですか?

答えて

0

1つの方法は、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機能をオーバーライドすることができます:あなたがそのようなことを行います場合はどう

関連する問題