Laravel. Тестовые данные для БД

09.09.2020

Теги: CLILaravelMySQLБазаДанныхКлассМиграцииТаблицаТеорияФреймворк

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',
    /* ... */
]

Поиск: CLI • Laravel • MySQL • База данных • Класс • Миграции • Фреймворк • Таблица • seeding • artisan • Теория

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.