В 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. Если у вас возникнут вопросы, не стесняйтесь их задавать!