1. База данных
  2. База данных: наполнение

Присоединяйся к нашему Telegram сообществу @webblend!

Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.

Введение

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

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

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

Чтобы создать сидер, выполните команду Artisan make:seeder. Все сидеры, созданные фреймворком, будут помещены в каталог database/seeders:

php artisan make:seeder UserSeeder

Класс сидера по умолчанию содержит только один метод: run. Этот метод вызывается при выполнении команды Artisan db:seed. Внутри метода run вы можете вставлять данные в базу данных любым удобным для вас способом. Вы можете использовать строитель запросов, чтобы вручную вставлять данные, или фабрики моделей 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).'@gmail.com',
'password' => Hash::make('password'),
]);
}
}

Примечание Вы можете указать зависимости, которые вам нужны, в сигнатуре метода run. Они будут автоматически разрешены через сервис-контейнер 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,
]);
}
}

Запуск сидеров

Для наполнения базы данных вы можете использовать команду 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 вас попросят подтверждение. Чтобы принудительно выполнить сидеры без запроса подтверждения, используйте флаг --force:

php artisan db:seed --force