Monday, 11 November 2019

Laravel factories association only associates the last data. How to fix this?

I have 2 models that needs to be associated once the data was created. I already asked it here and got the answer. I implemented it and made some modification because it doesn't associate the data correctly. Now I have problem with the association. It is only associated on the last data.

What I'm expecting is all the data created from the factory is associated to each other.

When I do php artisan tinker and run App\App::first()->load('menus', 'menus.page') command, it does not give me the correct data. Please take a look at the result here.

As you can see, the right data shown only on the last object. The rest is null. How can I fix this? Please take a look at my seeder file below, do I made any mistake?

<?php

use App\App;
use App\Component;
use App\Menu;
use App\Page;
use App\Role;
use App\Submenu;
use App\User;
use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $superadmin = Role::whereName('superadmin')->first();

        $tester = new User();
        $tester->name = "Tester";
        $tester->email = "test@appbuilder.com";
        $tester->password = bcrypt('password');
        $tester->save();

        $tester->roles()->attach($superadmin);

        // Create 5 apps for each user
        $tester->apps()->saveMany(factory(App::class, 5)->make())->each(function ($app) {
            $menus = factory(Menu::class, 5)->make();
            $pages = factory(Page::class, 5)->make();

            // Create 5 menus for each app and 5 submenus for each menu
            $app->menus()->saveMany($menus)->each(function ($menu) use ($pages) {
                // Associate page with each menu
                $pages->each(function ($page) use ($menu) {
                    $page->menu()->associate($menu);
                });

                // Create 5 submenus for each menu
                $menu->submenus()->saveMany(factory(Submenu::class, 5)->make())->each(function ($submenu) use ($pages) {
                    // Associate page with each submenu
                    $pages->each(function ($page) use ($submenu) {
                        $page->submenu()->associate($submenu);
                    });
                });
            });

            // Create 5 pages for each app and 5 components for each page
            $app->pages()->saveMany($pages)->each(function ($page) {
                $page->components()->saveMany(factory(Component::class, 5)->make());
            });
        });
    }
}


from Laravel factories association only associates the last data. How to fix this?

No comments:

Post a Comment