Solución:
probado en laravel 4.2 para las relaciones pertenece a muchas
si estás en el modelo:
//copy attributes
$new = $this->replicate();
//save model before you recreate relations (so it has an id)
$new->push();
//reset relations on EXISTING MODEL (this way you can control which ones will be loaded
$this->relations = [];
//load relations on EXISTING MODEL
$this->load('relation1','relation2');
//re-sync everything
foreach ($this->relations as $relationName => $values){
$new->{$relationName}()->sync($values);
}
También puede probar la función de replicación proporcionada por elocuente:
http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Model.html#method_replicate
$user = User::find(1);
$new_user = $user->replicate();
$new_user->push();
Puede probar esto (Clonación de objetos):
$user = User::find(1);
$new_user = clone $user;
Ya que clone
no hace una copia profunda, por lo que los objetos secundarios no se copiarán si hay algún objeto secundario disponible y, en este caso, debe copiar el objeto secundario usando clone
a mano. Por ejemplo:
$user = User::with('role')->find(1);
$new_user = clone $user; // copy the $user
$new_user->role = clone $user->role; // copy the $user->role
En tu caso roles
será una colección de Role
objetos para que cada uno Role object
en la colección debe copiarse manualmente usando clone
.
Además, debe tener en cuenta eso, si no carga el roles
utilizando with
entonces esos no se cargarán o no estarán disponibles en el $user
y cuando llamarás $user->roles
entonces esos objetos se cargarán en tiempo de ejecución después de esa llamada de $user->roles
y hasta esto, esos roles
no están cargados.
Actualizar:
Esta respuesta fue para Larave-4
y ahora Laravel ofrece replicate()
método, por ejemplo:
$user = User::find(1);
$newUser = $user->replicate();
// ...