Метод run
Метод run определён в классе Seeder и предназначен для выполнения логики наполнения базы данных. В этом методе вы можете использовать фабрики и другие сидеры для создания тестовых записей. Метод вызывается командой php artisan db:seed или при запуске миграций с флагом --seed. Название метода зарезервировано, переопределять его нельзя.
Метод не принимает параметров и не возвращает значений. Вся логика создания записей размещается непосредственно в теле метода.
Синтаксис
<?php
namespace DatabaseSeeders;
use IlluminateDatabaseSeeder;
use AppModelsUser;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
// Логика заполнения
}
}
?>
Пример
Создадим сидер для заполнения таблицы пользователей с использованием фабрики:
<?php
namespace DatabaseSeeders;
use IlluminateDatabaseSeeder;
use AppModelsUser;
use IlluminateSupportFacadesHash;
class UserSeeder extends Seeder
{
public function run(): void
{
User::create([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => Hash::make('password123'),
]);
User::create([
'name' => 'Jane Smith',
'email' => 'jane@example.com',
'password' => Hash::make('secret456'),
]);
}
}
?>
Пример
Заполним базу данных с помощью фабрики, создающей множество записей:
<?php
namespace DatabaseSeeders;
use IlluminateDatabaseSeeder;
use AppModelsPost;
use AppModelsUser;
class PostSeeder extends Seeder
{
public function run(): void
{
$user = User::first();
if ($user) {
Post::factory(10)->create([
'user_id' => $user->id,
]);
}
}
}
?>
Пример
В основном сидере можно вызвать другие сидеры для группового заполнения:
<?php
namespace DatabaseSeeders;
use IlluminateDatabaseSeeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
}
?>
Пример
Использование фабрики для создания связанных записей с состоянием:
<?php
namespace DatabaseSeeders;
use IlluminateDatabaseSeeder;
use AppModelsOrder;
use AppModelsProduct;
class OrderSeeder extends Seeder
{
public function run(): void
{
$products = Product::factory(5)->create();
Order::factory(3)->create()->each(function ($order) use ($products) {
$order->products()->attach(
$products->random(2)->pluck('id')->toArray()
);
});
}
}
?>