Laravel. Тестовые данные для БД
09.09.2020
Теги: CLI • Laravel • MySQL • БазаДанных • Класс • Миграции • Таблица • Теория • Фреймворк
Laravel включает в себя механизм наполнения базы данных начальными данными (seeding) с помощью специальных классов. Все такие классы хранятся в директории database/seeds
. Они могут иметь любое имя, но лучше придерживаться какой-то логики в их именовании — например, UserTableSeeder
(пользователи сайта), PostTableSeeder
(посты блога) и т.д.
Классы для наполнения БД
По умолчанию в Laravel уже определён класс DatabaseSeeder
. Из этого класса можно вызывать метод call()
для подключения других классов с данными, что позволит контролировать порядок их выполнения.
<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { // $this->call(UserTableSeeder::class); } }
Для создания заготовок классов UserTableSeeder
и PostTableSeeder
используем команду:
> php artisan make:seeder UserTableSeeder
> php artisan make:seeder PostTableSeeder
<?php use Illuminate\Database\Seeder; class UserTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // ..... } }
<?php use Illuminate\Database\Seeder; class PostTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // ..... } }
Отредактируем исходный код класса DatabaseSeeder
, а точнее — метод run()
:
<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { $this->call(UserTableSeeder::class); $this->command->info('Таблица пользователей загружена данными!'); $this->call(PostTableSeeder::class); $this->command->info('Таблица постов блога загружена данными!'); } }
Фабрики моделей
Файлы фабрик моделей хранятся в директории database/factories
, и там уже есть один готовый файл UserFactory.php
— это фабрика для модели User
.
<?php /** @var \Illuminate\Database\Eloquent\Factory $factory */ use App\User; use Faker\Generator as Faker; use Illuminate\Support\Str; /* |-------------------------------------------------------------------------- | Model Factories |-------------------------------------------------------------------------- | | This directory should contain each of the model factory definitions for | your application. Factories provide a convenient way to generate new | model instances for testing / seeding your application's database. | */ $factory->define(User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => '.....', 'remember_token' => Str::random(10), ]; });
Для заполнения полей name
и email
используется класс Faker
, который как раз и генерирует случайные, но правдоподобные значения. Чтобы создать фабрику для модели Post
, используем Artisan-команду:
> php artisan make:factory PostFactory --model=Post
<?php /** @var \Illuminate\Database\Eloquent\Factory $factory */ use App\Post; use Faker\Generator as Faker; $factory->define(Post::class, function (Faker $faker) { return [ // ..... ]; });
Отредактируем этот файл, чтобы заполнять таблицу БД правдоподобными значениями:
<?php /** @var \Illuminate\Database\Eloquent\Factory $factory */ use App\Post; use Faker\Generator as Faker; $factory->define(Post::class, function (Faker $faker) { return [ 'author_id' => rand(1, 4), 'title' => $faker->realText(rand(25, 30)), 'excerpt' => $faker->realText(rand(100, 120)), 'body' => $faker->realText(rand(200, 300)), 'created_at' => $faker->dateTimeBetween('-60 days', '-30 days'), 'updated_at' => $faker->dateTimeBetween('-20 days', '-1 days'), ]; });
И отредактируем файлы классов UserTableSeeder
и PostTableSeeder
:
<?php use Illuminate\Database\Seeder; class UserTableSeeder extends Seeder { public function run() { // создать 4 пользователей сайта factory(App\User::class, 4)->create(); } }
<?php use Illuminate\Database\Seeder; class PostTableSeeder extends Seeder { public function run() { // создать 20 постов блога factory(App\Post::class, 20)->create(); } }
Команды для наполнения БД
Для добавления начальных данных в БД предназначена Artisan-команда db:seed
:
> php artisan db:seed
По умолчанию команда db:seed
вызывает класс DatabaseSeeder
, который может быть использован для вызова других классов, заполняющих БД начальными данными. Однако, можно использовать параметр --class
для указания конкретного класса для вызова:
> php artisan db:seed --class=UserTableSeeder
Также можно сначала откатить все миграции, накатить их снова + заполнить начальными данными:
> php artisan migrate:refresh --seed
Или можно удалить все таблицы БД, накатить все миграции и заполнить БД начальными данными:
> php artisan migrate:fresh --seed Dropped all tables successfully. Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.03 seconds) Migrating: 2020_09_06_104713_create_posts_table Migrated: 2020_09_06_104713_create_posts_table (0.05 seconds) Seeding: UserTableSeeder Seeded: UserTableSeeder (0.1 seconds) Таблица пользователей загружена данными! Seeding: PostTableSeeder Seeded: PostTableSeeder (0.46 seconds) Таблица постов блога загружена данными! Database seeding completed successfully.
Локализация начальных данных
Редактируем файл config/app.php
и заменяем в нем английский на русский
return [ /* ... */ 'faker_locale' => 'ru_RU', /* ... */ ]
- Laravel. Миграции базы данных
- Мини-блог на Laravel, часть 1. Создание таблиц БД, наполнение тестовыми данными
- Laravel. Работа с БД. Часть вторая — конструктор запроса
- Laravel. Работа с БД. Часть первая — сырой запрос
- Laravel. Мягкое удаление (soft deletes)
- Мини-блог на Laravel, часть 3. Постраничная навигация, layout-шаблон и поиск по блогу
- Мини-блог на Laravel, часть 2. Создание контроллера, представления и маршрута
Поиск: CLI • Laravel • MySQL • База данных • Класс • Миграции • Фреймворк • Таблица • seeding • artisan • Теория