#Введение
Laravel включает возможность заполнения базы данных данными с помощью классов сидеров. Все классы сидеров хранятся в каталоге database/seeders. По умолчанию для вас определён класс DatabaseSeeder. Из этого класса вы можете использовать метод call для запуска других классов сидеров, что позволяет контролировать порядок заполнения.
Защита от массового присвоения (mass assignment protection) автоматически отключается во время заполнения базы данных.
#Создание сидеров
Чтобы создать сидер, выполните команду make:seeder Artisan. Все сидеры, созданные фреймворком, будут помещены в каталог database/seeders:
php artisan make:seeder UserSeeder
Класс сидера по умолчанию содержит только один метод: run. Этот метод вызывается при выполнении команды db:seed Artisan. Внутри метода run вы можете вставлять данные в базу любым удобным способом. Можно использовать query builder для ручной вставки данных или фабрики моделей Eloquent.
В качестве примера изменим класс DatabaseSeeder по умолчанию и добавим оператор вставки данных в метод run:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
/**
* Запустить сидеры базы данных.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}
Вы можете указывать любые зависимости в сигнатуре метода run. Они автоматически будут разрешены через service container Laravel.
#Использование фабрик моделей
Разумеется, вручную задавать атрибуты для каждого сида модели неудобно. Вместо этого можно использовать фабрики моделей для удобного создания большого количества записей в базе. Сначала ознакомьтесь с документацией по фабрикам моделей, чтобы узнать, как их определять.
Например, создадим 50 пользователей, у каждого из которых есть один связанный пост:
use App\Models\User;
/**
* Запустить сидеры базы данных.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
#Вызов дополнительных сидеров
В классе DatabaseSeeder вы можете использовать метод call для запуска дополнительных классов сидеров. Использование метода call позволяет разбить заполнение базы на несколько файлов, чтобы один класс сидера не становился слишком большим. Метод call принимает массив классов сидеров, которые должны быть выполнены:
/**
* Запустить сидеры базы данных.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
#Отключение событий моделей
При запуске сидов может потребоваться предотвратить отправку событий моделями. Для этого используйте трейт WithoutModelEvents. При использовании трейта WithoutModelEvents гарантируется, что события моделей не будут отправляться, даже если дополнительные классы сидеров выполняются через метод call:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
/**
* Запустить сидеры базы данных.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}
#Запуск сидеров
Вы можете выполнить команду db:seed Artisan для заполнения базы данных. По умолчанию команда db:seed запускает класс Database\Seeders\DatabaseSeeder, который может в свою очередь вызывать другие классы сидеров. Однако вы можете использовать опцию --class, чтобы указать конкретный класс сидера для отдельного запуска:
php artisan db:seed
php artisan db:seed --class=UserSeeder
Также можно заполнить базу данных с помощью команды migrate:fresh вместе с опцией --seed, которая удалит все таблицы и заново выполнит все миграции. Эта команда полезна для полного восстановления базы данных. Опция --seeder позволяет указать конкретный сидер для запуска:
php artisan migrate:fresh --seed
php artisan migrate:fresh --seed --seeder=UserSeeder
#Принудительный запуск сидеров в production
Некоторые операции сидирования могут привести к изменению или потере данных. Чтобы защитить вас от запуска команд сидирования против вашей базы данных в окружении production, перед выполнением сидеров вам будет предложено подтвердить действие. Чтобы принудительно запустить сидеры без запроса подтверждения, используйте флаг --force:
php artisan db:seed --force