Clone an Eloquent object including all relationships?

clone, eloquent, laravel, laravel-4

Solution

tested in laravel 4.2 for belongsToMany relationships

if you're in the model:

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

Problem

Is there any way to easily clone an Eloquent object, including all of its relationships? For example, if I had these tables: ``` users ( id, name, email ) roles ( id, name ) user_roles ( user_id, role_id ) ``` In addition to creating a new row in the `users` table, with all columns being the same except `id`, it should also create a new row in the `user_roles` table, assigning the same role to the new user. Something like this: ``` $user = User::find(1); $new_user = $user->clone(); ``` Where the User model has ``` class User extends Eloquent { public function roles() { return $this->hasMany('Role', 'user_roles'); } } ```

Original source