В версии 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 предоставляет простой механизм для простой и повторяемой вставки тестовых данных в вашу базу данных.
0 комментариев