DEV Community

Dave Fulton
Dave Fulton

Posted on

Creating Multiple Model Objects at Once

Disclaimer - I'm still fairly new to Laravel, so I'll readily admit that there may be other/better ways of doing this, or that this is already well known. But a bit of Googling seemed to indicate otherwise

So today I was presented with a bit of a challenge. I have a parent object that I'll creatively call "App\Parent" which has a bunch of children I'll call, um, "App\Child"?

Yeah, that works.

So the children are basically just a bunch of filenames, and the POST request already has them put into an array, so I'd like to just stick that array in some kind of Model::Create() method, but Create() seems to prefer just one set of attributes, thank you very much.

Some looking around found a solution in using the Insert() method. This would allow me to insert as many records as I wanted but apparently wouldn't set the timestamps. And I don't want to do that manually. Or rather, I don't want to waste the server's time doing it manually.

And that's when I stumbled onto the solution. If you have a HasMany relationship, you can use the CreateMany() method on that. Let me give you an example. Say I have a couple of basic Models that are related with a HasMany/BelongsTo.

class Parent extends Model
{
    public function children()
    {
        return $this->hasMany('App\Child');
    }
}

class Child extends Model
{
    public function parent()
    {
        return $this->belongsTo('App\Parent');
    }
}

I can leverage that relationship to create all the children I want in one shot. Let's say I get a request with 'parentName' and an array of 'childNames'. I can handle it like so:

class ParentController extends Controller
{
    public function store(Request $request)
    {
        $parentName = $request->get('parentName');
        $childNames = $request->get('childNames');
        // Remember, $childNames is already an array

        $parent = Parent::create(['parent_name' => $parentName]);
        $parent->children()->createMany($childNames);
    }
}

That's it. And a little bonus feature is that you don't even have to pass in the 'parent_id' as an attribute; it's handled automatically. As I said before, this may all be common knowledge, but if it's not, I want this to at least be easier to find for the next person!

Happy Hacking!

Top comments (2)

Collapse
 
robhill369 profile image
robhill369 •

Hi Dave,

I've been searching for hints about how to solve a similar problem to this one, with not much luck. In my example, I'm not explicitly declaring children in the POST request. Instead, the POST request is sent a quantity for how many children should be created. These Children contain their own id, their parent_id, and timestamps. I'm racking my brain about how best to go about coding this all in the ParentController. Please help!

Thanks

Collapse
 
adgower profile image
Alex Gower • • Edited

from laravel docs

$post = Post::find(1);

$post->comments()->createMany([
    ['message' => 'A new comment.'],
    ['message' => 'Another new comment.'],
]);
Enter fullscreen mode Exit fullscreen mode