Как в ларавель заполнить таблицу pivot из сидов?

В Laravel, заполнение таблицы pivot из сидов требует нескольких шагов. Ниже я расскажу вам подробно, как это сделать.

Для начала убедитесь, что у вас уже созданы таблицы, которые вы хотите заполнить связью многие-ко-многим, а также таблица pivot, которая будет связывать эти две таблицы.

Далее создайте сиды для каждой таблицы. Сиды представляют собой классы, которые расширяют класс IlluminateDatabaseSeeder. В методе run() каждого сида вы будете заполнять соответствующую таблицу начальными данными.

Примерный код сида для каждой таблицы мог бы выглядеть так:

use IlluminateDatabaseSeeder;
use AppRepositoriesUserRepository;
use AppRepositoriesRoleRepository;

class UsersTableSeeder extends Seeder
{
    protected $userRepository;

    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function run()
    {
        $users = [
            [
                'name' => 'John Doe',
                'email' => '[email protected]',
                'password' => bcrypt('secret'),
            ],
            // Добавьте других пользователей здесь
        ];

        foreach ($users as $user) {
            $this->userRepository->create($user);
        }
    }
}

class RolesTableSeeder extends Seeder
{
    protected $roleRepository;

    public function __construct(RoleRepository $roleRepository)
    {
        $this->roleRepository = $roleRepository;
    }

    public function run()
    {
        $roles = [
            [
                'name' => 'Admin',
            ],
            // Добавьте другие роли здесь
        ];

        foreach ($roles as $role) {
            $this->roleRepository->create($role);
        }
    }
}

Обратите внимание, что я использовал репозитории (UserRepository и RoleRepository) для добавления записей в соответствующие таблицы. Вам нужно заменить их на ваши репозитории или использовать модели напрямую.

Затем создайте еще один сид для таблицы pivot, где вы будете создавать связи между пользователями и ролями. В методе run() этого сида вы можете использовать функцию attach() или sync() для создания связей.

use IlluminateDatabaseSeeder;
use AppRepositoriesUserRepository;
use AppRepositoriesRoleRepository;

class UserRolesTableSeeder extends Seeder
{
    protected $userRepository;
    protected $roleRepository;

    public function __construct(UserRepository $userRepository, RoleRepository $roleRepository)
    {
        $this->userRepository = $userRepository;
        $this->roleRepository = $roleRepository;
    }

    public function run()
    {
        $adminRole = $this->roleRepository->findByName('Admin'); // Получаем роль "Admin"
        
        $admin = $this->userRepository->findByEmail('[email protected]'); // Получаем пользователя по email
        
        // Создаем связь между пользователем и ролью
        $admin->roles()->attach($adminRole);
    }
}

Обратите внимание, что я использовал функции findByName() и findByEmail() в репозиториях для поиска соответствующих записей. Вы должны заменить их на соответствующие методы ваших репозиториев или использовать аналогичные методы моделей.

Наконец, зарегистрируйте сиды в файле DatabaseSeeder в методе run(). Это позволит Laravel выполнять все необходимые сиды при запуске команды php artisan db:seed.

use IlluminateDatabaseSeeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(UsersTableSeeder::class);
        $this->call(RolesTableSeeder::class);
        $this->call(UserRolesTableSeeder::class);
    }
}

Теперь, когда вы выполните команду php artisan db:seed, сиды будут запускаться в нужной последовательности и заполнять таблицы и связи в базе данных.

Надеюсь, это помогло вам разобраться, как заполнить таблицу pivot из сидов в Laravel. Если у вас возникнут вопросы, не стесняйтесь их задавать!