2015-11-11 6 views
6

Ich versuche, durch komplexe redegewandte Modellbeziehungen/Attribute zu gehen, und ich würde gerne eine einfache Punktstruktur verwenden, um dies zu durchlaufen, ähnlich wie Sie können Traverse Arrays mit Arr::get()Wie traversiere ich durch Modellbeziehungen in Laravel mit Punktsyntax

Beispiel:

$data = [ 
    'foo' => [ 
    'bar' => [ 
     'key' => 'value' 
    ] 
    ] 
]; 
$value = Arr::get($data, 'foo.bar.key'); // returns 'value' 

ich habe versucht, mit

$value = Arr::get($model, 'relation.subrelation.attribute') 

jedoch dies nicht gelingt und aways gibt null zurück, auch tho Hochkarätige Modelle unterstützen ArrayAccess.

Hat Laravel eine einfache Möglichkeit, dies zu erreichen?

+0

Da Beziehungen einer zu viele sein könnte, könnte es Ein Array von Objekten mit numerischen Indizes sein. Überprüfen Sie, ob das das Problem ist. – anwerj

+0

@anwerjunaid dies sind reine Eins-zu-eins-Beziehungen (Kind/Eltern), aber danke für den Vorschlag –

+0

Ändern Sie die Sammlung von der Modellabfrage zu Array? Sie sollten zuerst '-> toArray()' für die Sammlung verwenden. – Mithredate

Antwort

3

Für alle, die fragen, ich habe es geschafft, eine Lösung, um herauszufinden, durch Modifizieren der arr :: Pull() Funktion arbeiten, speziell mit den Modellen:

public static function traverse($model, $key, $default = null) 
{ 
    if (is_array($model)) { 
     return Arr::get($model, $key, $default); 
    } 


    if (is_null($key)) { 
     return $model; 
    } 

    if (isset($model[$key])) { 
     return $model[$key]; 
    } 

    foreach (explode('.', $key) as $segment) { 
     try { 
      $model = $model->$segment; 
     } catch (\Exception $e) { 
      return value($default); 
     } 
    } 

    return $model; 
} 
-1

Eloquent Modelle geben eine Collection zurück, die in PHP nicht mit Array übereinstimmt. Sie können es auf Array konvertieren toArray() Funktion

$my_model->toArray(); 

Verwendung Damit haben Sie dann ein Array. Beachten Sie jedoch, dass alle verschachtelten Modelle im Hauptmodell ebenfalls in ein Array konvertiert werden.

Verwandte Themen