Урок 07

Сиды: заполнение данными

Сидер — это класс, который наполняет БД данными. Сиды используются для тестовых данных при разработке, справочников, начальных настроек.

Создание

php artisan make:seeder PostSeeder

Файл database/seeders/PostSeeder.php.

Простой сидер

namespace Database\Seeders;

use App\Models\Post;
use Illuminate\Database\Seeder;

class PostSeeder extends Seeder
{
    public function run(): void
    {
        Post::create([
            'title' => 'Первый пост',
            'body' => 'Текст',
        ]);

        Post::create([
            'title' => 'Второй пост',
            'body' => 'Текст',
        ]);
    }
}

Массив данных

public function run(): void
{
    $posts = [
        ['title' => 'A', 'body' => 'Text A'],
        ['title' => 'B', 'body' => 'Text B'],
        ['title' => 'C', 'body' => 'Text C'],
    ];

    foreach ($posts as $post) {
        Post::create($post);
    }
}

Массовая вставка

Post::insert($posts);

insert быстрее, но не запускает события модели и не проставляет timestamps.

Идемпотентность

Сидеры должны быть безопасны при повторном запуске. Используй updateOrCreate:

Post::updateOrCreate(
    ['slug' => 'hello-world'],
    ['title' => 'Hello World', 'body' => 'Text']
);

DatabaseSeeder

Главный сидер, который вызывает остальные:

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
            PostSeeder::class,
        ]);
    }
}

Запуск

php artisan db:seed                     # запустить DatabaseSeeder
php artisan db:seed --class=PostSeeder  # конкретный сидер
php artisan migrate:fresh --seed        # пересоздать БД и засеять

Продакшен

Сиды для продакшена должны быть идемпотентными и содержать только справочные данные, а не тестовые.