Saltar al contenido

¿Clonar un objeto Eloquent incluyendo todas las relaciones?

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();
// ...
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *