Laravel Eloquent ORM replicate

Tengo un problema con la replicación de uno de mis modelos con todas las relaciones.

La estructura de la base de datos es la siguiente:

Table1: products id name Table2: product_options id product_id option Table3: categories id name Pivot table: product_categories product_id category_id 

Las relaciones son:

  • product hasMany product_options
  • producto pertenece a muchas categorías (a través de product_categories)

Me gustaría clonar un producto con todas las relaciones. Actualmente aquí está mi código:

 $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(); } 

Pero esto no funciona (las relaciones no están clonadas, actualmente solo traté de clonar las opciones de producto).

Este código, funcionó para mí:

 $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()); } } 

Respuesta desde aquí: ¿ Clonar un objeto eloquent incluyendo todas las relaciones?

Esta respuesta (la misma pregunta), también funciona bien.

 //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(); } } 

Desde aquí: ¿ Clonar un objeto eloquent incluyendo todas las relaciones?

El código funciona bien para muchas a muchas relaciones en mi experiencia.

Intenta usar attach para crear la relación:

 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); } 
 $product = Product::with('options')->find($id); $new_product = $product->replicate(); $new_product->{attribute} = {value}; $new_product->push(); $new_product->options()->saveMany($product->options); 

Esto funcionó bien en 5.5. Imagen, media es un nombre de relación.

 $event = Events::with('image','media')->find($event_id); if($event){ $newevent = $event->replicate(); $newevent->push(); foreach ($newevent->getRelations() as $relation => $entries) { foreach($entries as $entry) { $e = $entry->replicate(); if ($e->push()) { $newevent->{$relation}()->save($e); } } } }