Наполнение

Содержание:


Введение

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


Написание Seeder-ов

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

php artisan make:seeder UsersTableSeeder

Сидер класс только один метод по умолчанию: run. Этот метод вызывается при выполнении команды db:seed. Внутри метода run вы можете вставить данные в вашу базу данных так как вы захотите. Можно использовать конструктор запросов для того, чтобы вставлять данные вручную. или вы можете и использовать фабрики моделей Eloquent.

В качестве примера, давайте определим базовый класс DatabaseSeeder и добавим некоторые параметры ввода в метод run:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'password' => bcrypt('password'),
        ]);
    }
}
Вы можете вписывать любые зависимости, которые необходимо, внутри подписи метода run благодаря сервис-контейнеру.

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

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

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

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    factory(App\User::class, 50)->create()->each(function ($user) {
        $user->posts()->save(factory(App\Post::class)->make());
    });
}

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

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

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $this->call([
        UsersTableSeeder::class,
        PostsTableSeeder::class,
        CommentsTableSeeder::class,
    ]);
}

Запуск наполнения

После написания вашего сидера, вам потребует возобновить автозагрузку Composer используя команду dump-autoload:

composer dump-autoload

Теперь вы можете использовать команду Артизан db:seed для наполнения вашей базы. По умолчанию, команда db:seed зупускает класс DatabaseSeeder, который может использоваться как ссылка на остальные классы сидеры. Однако, вы также можете использовать опцию --class для указания класса сидера, который необходимо запустить:

php artisan db:seed

php artisan db:seed --class=UsersTableSeeder

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

php artisan migrate:refresh --seed

Заставить сидеры выполняться на сервере.

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

php artisan db:seed --force