2016-03-15 6 views
4

У меня проблема с копированием одной из моих моделей со всеми отношениями.Laravel Eloquent ORM replicate

Структура базы данных выглядит следующим образом:

Table1: products 
id 
name 

Table2: product_options 
id 
product_id 
option 

Table3: categories 
id 
name 

Pivot table: product_categories 
product_id 
category_id 

Отношения:

  • продукт hasMany product_options
  • продукт belongsToMany категории (корыто product_categories)

Я хотел бы клонировать продукт со всеми отношениями. В настоящее время здесь мой код:

$product = Product::with('options')->find($id); 
$new_product = $product->replicate(); 
$new_product->push(); 
foreach($product->options as $option){ 
    $new_option = $option->replicate(); 
    $new_option->product_id = $new_product->id; 
    $new_option->push(); 
} 

Но это не работает (отношения не клонируются - в настоящее время я просто попытался клонировать product_options).

+1

Ответ: http://stackoverflow.com/questions/23895126/clone-an-eloquent-object-including-all-relationships#answer-34032304 и этот ответ: http://stackoverflow.com/ вопросы/23895126/clone-an-eloquent-object-including-all-relationship # answer-32775847 работал для меня – haakym

+1

Можете ли вы переместить свой комментарий к ответу, пожалуйста? – Zoli

ответ

4

Этот код, работал для меня:

$model = User::find($id); 

$model->load('invoices'); 

$newModel = $model->replicate(); 
$newModel->push(); 

foreach($model->getRelations() as $relation => $items){ 
    foreach($items as $item){ 
     unset($item->id); 
     $newModel->{$relation}()->create($item->toArray()); 
    } 
} 

Ответ здесь: Clone an Eloquent object including all relationships?

Этот ответ (тот же вопрос), а также отлично работает.

//copy attributes from original model 
$newRecord = $original->replicate(); 
// Reset any fields needed to connect to another parent, etc 
$newRecord->some_id = $otherParent->id; 
//save model before you recreate relations (so it has an id) 
$newRecord->push(); 
//reset relations on EXISTING MODEL (this way you can control which ones will be loaded 
$original->relations = []; 
//load relations on EXISTING MODEL 
$original->load('somerelationship', 'anotherrelationship'); 
//re-sync the child relationships 
$relations = $original->getRelations(); 
foreach ($relations as $relation) { 
    foreach ($relation as $relationRecord) { 
     $newRelationship = $relationRecord->replicate(); 
     $newRelationship->some_parent_id = $newRecord->id; 
     $newRelationship->push(); 
    } 
} 

Отсюда: Clone an Eloquent object including all relationships?

код отлично работает для многих многих отношениях в моем опыте.

2

Попробуйте использовать attach для создания отношений:

foreach($product->options as $option){ 
    $new_option = $option->replicate(); 
    $new_option->save(); 
    $new_option_id = $new_option->id; 
    $new_product->options()->attach($new_option_id); 
} 
1
$product = Product::with('options')->find($id); 
$new_product = $product->replicate(); 
$new_product->{attribute} = {value}; 
$new_product->push(); 

$new_product->options()->saveMany($product->options); 
+2

Вы должны объяснить свой ответ, чтобы искатель (и любой другой, кто его нашел) узнал, что делает этот код. – Machavity