2017-09-22 2 views
0

Ich habe ein Elternteil die Kinder hasMany:Wie ändert man die Beziehung bei der Konvertierung in 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); 
    } 
} 

Child-Modell hat nur zwei Attribute: parent_id und value. Ich möchte Wert „rupfen“, wenn Eltern zu json Umwandlung, so dass anstelle von

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

I

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

bekommen Ich weiß, dass es durch die Deklaration einer neuen getValuesAttribute erreicht werden kann, und das Hinzufügen von protected $appends = ['values']; dem Mutterunter Modell, aber ich möchte dies tun, ohne das Attribut umzubenennen (ich möchte Werte in children Array und nicht in values Array). Wenn ich Mutatorattribut mit dem gleichen Namen als Relation definiere, führt dies offensichtlich zu Fehlern.

Wie kann ich das tun?

Antwort

0

Ein Ansatz besteht darin, Fractal zu verwenden, um die Darstellung Ihrer Daten vom Modell zu trennen. Wenn Sie einen Fractal-Transformator definieren, der der gewünschten Struktur entspricht, können Sie die Daten an den Transformator in Ihrem Controller übergeben und die Struktur des JSON ändern, ohne das Modell zu berühren.

EDIT: Laravel 5.5 eingeführt resources, die eine einfachere Alternative zu Fractal sind, aber im Grunde die gleiche Sache.

0

Was ist, wenn Sie so etwas tun:

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

return $parent->toJson(); 
0

Sie konnten die jsonSerialize Funktion in Ihnen Parent Modell außer Kraft setzen:

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

tun, dass Sie die korrekte Ausgabe erhalten wird, wenn die toJson() Aufruf Methode oder beim Zurückgeben des Modells als Antwort json (die intern ruft toJson().

Verwandte Themen