Skip to content
Icon

ПРЕДУПРЕЖДЕНИЕ Вы просматриваете документацию к старой версии Laravel. Рассмотрите возможность обновления Вашего проекта до Laravel 9.x.

База Данных: Сидеры

Введение

Laravel включает в себя возможность заполнять вашу базу данных данными с помощью начальных классов. Все начальные классы хранятся в каталоге database/seeders. По умолчанию для вас определен класс DatabaseSeeder. Из этого класса вы можете использовать метод call для запуска других начальных классов, что позволяет вам контролировать порядок заполнения.

{tip} Защита от массового назначения автоматически отключается во время заполнения базы данных.

Написание сидов

Чтобы сгенерировать сидер, выполните 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
{
/**
* Run the database seeders.
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => Hash::make('password'),
]);
}
}

{tip} Вы можете указывать любые зависимости, которые вам нужны, в сигнатуре метода run. Они будут автоматически разрешены через Laravel сервис контейнер.

Использование фабрик моделей

Конечно, вручную указывать атрибуты для каждого начального числа модели обременительно. Вместо этого вы можете использовать фабрики моделей для удобного создания больших объемов записей базы данных. Сначала просмотрите документацию по фабрике моделей, чтобы узнать, как определить свои фабрики.

Например, давайте создадим 50 пользователей, у каждого из которых есть один связанный пост:

use App\Models\User;
 
/**
* Run the database seeders.
*
* @return void
*/
public function run()
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}

Вызов дополнительных сидов

В классе DatabaseSeeder вы можете использовать метод call для выполнения дополнительных начальных классов. Использование метода call позволяет разбить заполнение базы данных на несколько файлов, чтобы ни один отдельный класс сидера не стал слишком большим. Метод call принимает массив классов сидера, которые должны быть выполнены:

/**
* Run the database seeders.
*
* @return void
*/
public function run()
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}

Запуск сидов

Вы можете выполнить Artisan-команду db:seed, чтобы заполнить базу данных. По умолчанию команда db:seed запускает класс Database\Seeders\DatabaseSeeder, который, в свою очередь, может вызывать другие начальные классы. Однако вы можете использовать параметр --class, чтобы указать конкретный класс сеялки для индивидуального запуска:

php artisan db:seed
 
php artisan db:seed --class=UserSeeder

Вы также можете заполнить свою базу данных с помощью команды migrate:fresh в сочетании с параметром --seed, который удалит все таблицы и повторно запустит все ваши миграции. Эта команда полезна для полной перестройки вашей базы данных:

php artisan migrate:fresh --seed

Форсированный запуск сидов в продакшене

Некоторые операции заполнения могут привести к изменению или потере данных. Чтобы защитить вас от выполнения команд заполнения для вашей производственной базы данных, вам будет предложено подтвердить перед выполнением сидеров в production среде. Чтобы заставить сидеры запускаться без запроса, используйте флаг --force:

php artisan db:seed --force