В версии 0.5.0 Phinx представил поддержку заполнения вашей базы данных тестовыми данными. Начальные классы - отличный способ легко заполнить вашу базу данных данными после ее создания. По умолчанию они хранятся в каталоге seed; однако этот путь можно изменить в файле конфигурации.

Заполнение базы данных является совершенно необязательным, и Phinx по умолчанию не создает каталог seed .

Создание нового класса seed

Phinx включает команду для простого создания нового начального класса:

$ php vendor/bin/phinx seed:create UserSeeder

Если вы указали несколько исходных путей, вам будет предложено выбрать путь для создания нового начального класса.

Он основан на шаблоне скелета:

<?php

use Phinx\Seed\AbstractSeed;

class MyNewSeeder extends AbstractSeed
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeders is available here:
     * http://docs.phinx.org/en/latest/seeding.html
     */
    public function run()
    {

    }
}

Класс AbstractSeed

Все семена Phinx происходят из этого AbstractSeedкласса. Этот класс обеспечивает необходимую поддержку для создания ваших начальных классов. Начальные классы в основном используются для вставки тестовых данных.

Метод run

Метод run автоматически вызывается Phinx, когда вы выполняете команду seed: run . Вы должны использовать этот метод для вставки ваших тестовых данных.

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

Метод init

init()Метод управляется Phinx перед методом выполнения , если он существует. Это можно использовать для инициализации свойств класса Seed перед использованием run.

Зависимости внешнего ключа

Часто вы обнаруживаете, что сеялки должны запускаться в определенном порядке, чтобы они не нарушали ограничения внешнего ключа. Чтобы определить этот порядок, вы можете реализовать getDependencies()метод, который возвращает массив сидеров для запуска перед текущим сидером:

<?php

use Phinx\Seed\AbstractSeed;

class ShoppingCartSeeder extends AbstractSeed
{
    public function getDependencies()
    {
        return [
            'UserSeeder',
            'ShopItemSeeder'
        ];
    }

    public function run()
    {
        // Seed the shopping cart  after the `UserSeeder` and
        // `ShopItemSeeder` have been run.
    }
}

Зависимости учитываются только при выполнении всех начальных классов (поведение по умолчанию). Они не будут учитываться при запуске определенных классов семян.

Вставка данных

Использование объекта таблицы

Исходные классы также могут использовать знакомый объект Table для вставки данных. Вы можете получить экземпляр объекта Table, вызвав table()метод из исходного класса, а затем использовать метод insert () для вставки данных:

<?php

use Phinx\Seed\AbstractSeed;

class PostsSeeder extends AbstractSeed
{
    public function run()
    {
        $data = [
            [
                'body'    => 'foo',
                'created' => date('Y-m-d H:i:s'),
            ],[
                'body'    => 'bar',
                'created' => date('Y-m-d H:i:s'),
            ]
        ];

        $posts = $this->table('posts');
        $posts->insert($data)
              ->saveData();
    }
}

Вы должны вызвать метод saveData (), чтобы сохранить данные в таблице. Phinx будет буферизовать данные, пока вы этого не сделаете.

Интеграция с библиотекой Faker

Использовать замечательную библиотеку Faker в ваших начальных классах - тривиальная задача . Просто установите его с помощью Composer:

$ composer require fzaninotto/faker

Затем используйте его в своих классах seed:

<?php

use Phinx\Seed\AbstractSeed;

class UserSeeder extends AbstractSeed
{
    public function run()
    {
        $faker = Faker\Factory::create();
        $data = [];
        for ($i = 0; $i < 100; $i++) {
            $data[] = [
                'username'      => $faker->userName,
                'password'      => sha1($faker->password),
                'password_salt' => sha1('foo'),
                'email'         => $faker->email,
                'first_name'    => $faker->firstName,
                'last_name'     => $faker->lastName,
                'created'       => date('Y-m-d H:i:s'),
            ];
        }

        $this->table('users')->insert($data)->saveData();
    }
}

Обрезка таблиц

Помимо вставки данных, Phinx упрощает очистку таблиц с помощью команды SQL TRUNCATE :

<?php

use Phinx\Seed\AbstractSeed;

class UserSeeder extends AbstractSeed
{
    public function run()
    {
        $data = [
            [
                'body'    => 'foo',
                'created' => date('Y-m-d H:i:s'),
            ],
            [
                'body'    => 'bar',
                'created' => date('Y-m-d H:i:s'),
            ]
        ];

        $posts = $this->table('posts');
        $posts->insert($data)
              ->saveData();

        // empty the table
        $posts->truncate();
    }
}

SQLite изначально не поддерживает команду TRUNCATE, поэтому за кулисами используется DELETE FROM . После усечения таблицы рекомендуется вызывать команду VACUUM . Phinx не делает этого автоматически.

Выполнение классов seed

Это легкая часть. Чтобы заполнить базу данных, просто используйте команду seed: run :

$ php vendor/bin/phinx seed:run

По умолчанию Phinx выполнит все доступные начальные классы. Если вы хотите запустить определенный класс, просто передайте его имя с помощью параметра -s :

$ php vendor/bin/phinx seed:run -s UserSeeder

Вы также можете запустить несколько сеялок:

$ php vendor/bin/phinx seed:run -s UserSeeder -s PermissionSeeder -s LogSeeder

Вы также можете использовать параметр -v для большей детализации вывода:

$ php vendor/bin/phinx seed:run -v

Функциональность семян Phinx предоставляет простой механизм для простой и повторяемой вставки тестовых данных в вашу базу данных.