2015-11-11 19 views
6

複雑な擬似モデルの関係や属性をトラバースしようとしていますが、単純なドット構造を使ってこれを繰り返すことができます私もカントー、しかしこれは失敗し、遠かっはnullを返しますlaravelのモデル関係をドット構文でトラバースする方法

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

使用してみました

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

Arr::get()

例とトラバースの配列雄弁なモデルはArrayAccessをサポートします。

これを行う簡単な方法はありますか?

+0

関係は多くのいずれかになりますので、そこにできました数値インデックスを持つオブジェクトの配列になります。それが問題であるかどうか確認してください。 – anwerj

+0

@anwerjunaidこれらは純粋に1対1の関係(子/親)ですが、提案に感謝 –

+0

コレクションをモデルクエリから配列に変更していますか?まずコレクション上で ' - > toArray()'を使うべきです。 – Mithredate

答えて

3

、私はARRを変更することで、ソリューションを把握する::モデルと特異的に働くプル()関数を管理している:

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 ModelsはPHPのArrayと同じではないCollectionを返します。あなたはtoArray()機能

$my_model->toArray(); 

これは、その後、あなたの配列を与えるを使用して配列に変換することができます。しかし、メインモデル内のすべてのネストされたモデルを配列に変換することも覚えておいてください。不思議すべての人のための

関連する問題