バージョン0.5.0 では、Phinx はデータベースにテストデータをシードするためのサポートを導入しました。
シードクラスは、作成済みのデータをデータベースに簡単に投入するための優れた方法です。
デフォルトでは seeds
ディレクトリーに保存されます。 ただし、このパスは設定ファイルで変更できます。
注釈
データベースのシードは完全にオプションで、
Phinx はデフォルトで seeds
ディレクトリーを作成しません。
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()
{
}
}
すべての Phinx のシードは AbstractSeed
クラスを継承します。
このクラスは、シードクラスを作成するために必要なサポートを提供します。
シードクラスは主にテストデータの挿入に使用されます。
run メソッドは、 seed:run コマンドを実行すると、Phinx によって自動的に呼び出されます。 このメソッドを使用してテストデータを挿入してください。
注釈
マイグレーションとは異なり、Phinx はどのシードクラスが実行されたかを把握していません。 これは、データベースシーダーを繰り返し実行できることを意味します。 開発時にはこのことに留意してください。
シードクラスは、使い慣れた Table
オブジェクトを使ってデータを挿入することもできます。
シードクラス内から table()
メソッドを呼び出し、 insert()
メソッドを使用して
データを挿入することで、Table オブジェクトのインスタンスを取得できます。
<?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)
->save();
}
}
注釈
save()
メソッドを呼び出して、データをテーブルにコミットする必要があります。
Phinx はデータをバッファリングします。
シードクラスですばらしい Faker ライブラリー を使うのは簡単です。Composer を使用してインストールするだけです。
$ composer require fzaninotto/faker
そして、シードクラスの中で、それを使用してください。
<?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->insert('users', $data);
}
}
データを挿入することに加えて、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)
->save();
// テーブルを空にします
$posts->truncate();
}
}
注釈
SQLite は TRUNCATE
コマンドをネイティブにサポートしていないので、 DELETE FROM
が使用されています。テーブルのデータ消去後、 VACUUM
コマンドを呼び出すことをお勧めします。
Phinx はこれを自動的には行いません。
これは簡単な部分です。データベースをシードするには、 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 のシード機能は、テストデータをデータベースに簡単かつ繰り返し挿入するための 簡単なメカニズムを提供します。