2016-08-04 29 views
1

ネストされたリレーションが多いモデルがあります。私はまず次のようにロードします:Laravelでネストされたリレーションを持つモデルを複製する方法

<?php 
$model = Model::where('id', $id) 
    ->with(
     'relation1', 
     'relation2', 
     'relation2.subrelation1', 
     'relation2.subrelation2', 
     'relation3', 
     'relation3.subrelation1', 
     'relation3.subrelation2', 
     'relation3.subrelation3', 
     'relation3.subrelation4.subrelation', 
    )->get(); 
?> 

ここで私はリレーションを複製し、最終的にそれらを複製します。

<?php 
$clone = $model->replicate(); 
$clone->push(); 

foreach ($model->getRelations() as $relation => $entries){ 
    foreach($entries as $entry){ 
     $e = $entry->replicate(); 
      if ($e->push()){ 
       $clone->{$relation}()->save($e); 

       // @todo Go further down 
      } 
     } 
    } 
} 
?> 

問題は、これが第1レベルの関係では完全に機能することです。ただし、追加のネストされたリレーションがある場合、それらは複製/クローニングされません。リレーションシップでさらにトラバースしてそれらを複製する最も効率的な方法は何ですか?

おかげ

答えて

1

私も子供を複製するために、あなたのモデルにreplicate()メソッドを上書きします。次に、その機能を特性に抽出し、その特性をすべてのモデルに適用します。ような何か:

trait DeepReplicates { 
    public function replicate(){ 
     $copy = parent::replicate(); 
     $copy->push(); 

     foreach ($model->getRelations() as $relation => $entries){ 
      foreach($entries as $entry){ 
       $e = $entry->replicate(); 
       if ($e->push()){ 
        $clone->{$relation}()->save($e); 
       } 
      } 
     } 
    } 
} 

そして、その形質を適用し、複製さすべてのモデルにも再帰的にラインの下の、それ自身の子供を複製します。ループで終わらないようにする必要がありますが、うまくいくはずです。

各モデルに変数を追加して、複製する子モデルの配列を指定することもできます。それは可能なロジックループを避けるでしょう。

+0

モデル内のレプリケート機能はどのように見えますか? – farjam

+0

あなたが書くことができるのは私の答えです。既存のものは、Illuminate/Database/Eloquent/Model、APIのソースコードにあります:https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Model.html#method_replicate – Jeff

+0

これはうまくいくでしょうがたくさんのレコードがある場合は遅くなります。 –

関連する問題