Faker в Laravel

Seeding, также известный как заполнение базы данных, представляет собой процесс генерации mock(фиктивных) данных в базе данных вашего приложения. Будь то для целей тестирования или других случаев использования, заполнение может быть очень полезным, когда мы не хотим начинать с чистого листа или добавлять фиктивные данные вручную.

Что такое Faker?

Faker — это пакет, который позволяет вам генерировать различные типы случайных данных, которые соответствуют схеме вашей базы данных. От простых имен, имен пользователей и случайных чисел до данных кредитных карт (разумеется, поддельных) — вы можете генерировать практически любой тип поддельных данных в базе данных вашего приложения.

Подключение базы данных

Чтобы подключить базу данных к приложению Laravel, вам понадобится база данных SQL: либо локальная, например PHPMYADMIN, которую мы будем использовать в этом руководстве.

Чтобы подключить базу данных, вам сначала нужно создать базу данных с нужным вам именем. В нашем случае мы создадим базу данных с именем testapp внутри PHPMYADMIN GUI следующим образом:

создать базу данных testapp

После этого откройте .env файл в редакторе и заполните следующие значения учетными данными вашей базы данных:

DB_CONNECTION=
DB_HOST=
DB_PORT=
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=  

Вот и все! Вы подключили свое приложение Laravel к базе данных SQL. Теперь осталось сгенерировать необходимые файлы.

Создание файлов модели, миграции и фабрики

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

php artisan make:model Post -m --factory

Это должно сгенерировать модель Post внутри app/models, класс фабрики внутри database/factories и файл миграции внутри database/migrations.

Модель Post​

Наша таблица постов будет содержать следующие столбцы title, body, likes, author, draft, поэтому мы добавим $fillable массив в свой /App/Models/Post.php файл следующим образом:

protected $fillable = ['title', 'body', 'likes', 'author', 'draft'];

Следующее, что нужно сделать, — это определить Post схему.

Миграция Post​

Чтобы определить, как должна выглядеть ваша схема и какие типы данных она должна содержать, вам нужно открыть вашу /database/migrations/2024_01_21_211528_create_posts_table.php(имя вашего файла будет другим) и внутри up функции вам нужно определить вашу схему, для нашей Post таблицы это будет выглядеть так:

    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->longText('body');
            $table->string('author');
            $table->integer('likes');
            $table->boolean('draft');
            $table->timestamps();
        });
    }

После этого нам нужно структурировать то, как Faker будет генерировать ваши данные внутри класса Factory, который вы сгенерировали ранее.

Класс «Factory»

Чтобы Faker правильно сгенерировал ваши данные, вам необходимо явно определить, как это следует делать внутри функции definition, сгенерированной внутри database/factories/PostFactory.phpфайла. Вам просто нужно отредактировать ее в соответствии с вашими столбцами и их типами. В нашем случае мы отредактируем ее так, чтобы она выглядела следующим образом:

    public function definition()
    {
        return [
            'title' => $this->faker->words(5, true),
            'body' => $this->faker->sentence(45),
            'likes' => $this->faker->randomNumber(5),
            'author' => $this->faker->name(),
            'draft' => $this->faker->boolean()
        ];
    }

Вышеуказанная функция сгенерирует:

  • title- 5 слов
  • body- 45 предложений
  • likes- случайные 5-значные числа
  • author- случайное нигерийское имя
  • draft- случайное логическое значение 1 или 0 (1 — true, а 0 — false).

Обратите внимание, как мы опустили id и timestampsпоскольку они будут сгенерированы автоматически. Далее вам нужно подключить PostFactory к Post модели, добавив следующую строку в начало файла фабрики, например:

namespace Database\Factories;

use App\Models\Post;
// other dependencies
class PostFactory extends Factory
{
    protected $model = Post::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
       // same as above
    }
}

Запустить класс фабрики через DatabaseSeeder.phpфайл

После определения функции определения внутри класса фабрики, следующее, что вам нужно сделать, это добавить вновь созданную фабрику внутрь /database/seeders/DatabaseSeeder.php файла, добавив ее внутрь метода run следующим образом:

\App\Models\Post::factory(200)->create();

Число 200 в строке кода выше определяет, сколько сообщений вы хотите сгенерировать.

Запустите миграции и seeder

После успешного завершения всех вышеперечисленных шагов вам нужно будет запустить миграции и seeder, а благодаря замечательному инструменту командной строки Laravel мы можем сделать и то, и другое с помощью всего одной команды, например:

php artisan migrate --seed

После успешного выполнения вы увидите в командной строке что-то вроде следующего:

успешная миграция и засев

Затем перейдите в менеджер баз данных, чтобы увидеть результат; вы должны увидеть что-то похожее на скриншот ниже:

таблицы созданы успешно

Таблица post была успешно создана, включая таблицы Laravel по умолчанию. Обратите внимание на маленький зеленый квадратик?, это наша posts таблица, содержащая 200 строк данных, сгенерированных Faker!, щелкните по таблице, чтобы увидеть ее содержимое:

посев успешный

Это наша таблица постов, заполненная данными!

Генерация локальных данных

Обратите внимание, что столбец авторов содержит случайные нигерийские имена? Это еще одна замечательная вещь в Faker, он позволяет вам генерировать локальные данные, где это возможно, и все, что вам нужно сделать, это установить faker_locale внутри config/app.php предпочитаемую вами страну.

Заключение

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