この記事について
CakePHPでは、bin/cake migrations
というコマンドを実行するだけで、SQLを手動で実行せずにデータを挿入することができる。これにより、開発環境やテスト環境で、データを汚しても、元の状態に戻すことができる。今回はそのやり方として、Seedingと呼ばれる、名の通り「種を植える」手法を紹介する。
Seedingとは
cakephpルートディレクトリ/Seeds
の配下にできる.php
形式のファイルをSeedファイルと言い、それを実行するとInsertが走る。この動作をSeeding
と呼ぶ。
参考
以下を参考にしました。
1. CakePHP3のSeeding(シーディング)で任意の初期データ投入&fakerでダミーデータ挿入もしてみる
2. 【CakePHP3】seedの使い方
cakephpルートディレクトリへ移動し、以下のコマンドを実行。
手順
以下の手順で初期データを仕込みます。
1. MySQLでまずデータを作る
2. MySQLのデータを元に、Seedファイルを自動生成する
3. MySQLを空にする
4. Seedingを実行し、 MySQLにデータを挿入する
5. Migrations migrateを実行し、MySQLにデータを挿入する
1. MySQLでまずデータを作る
Seedファイルを一から書き込むより、コマンドを叩いてMySQLのデータを元にシードファイルを作成した方が手取り早いので、まずはMySQLに適当なデータを作ります。
2. MySQLのデータを元に、Seedファイルを自動生成する
これを元に以下のコマンドを実行することで、元データのINSERT文が入ったSeedファイルが作成されます。
bin/cake bake seed --data Users
※Seedファイルを一から作りたい場合は以下を実行してください。
# seedのテンプレートファイルを生成する
bin/cake bake seed Users
# ユーザーテーブルのデータを元にseedファイルを生成する
bin/cake bake seed --data Users
これにより、Seeds
フォルダ配下に、UsersSeed.php
が作成されたはずなので、確認してください。
UsersSeed.php
では、AbstractSeedを継承し、かつrun
メゾットの中で、挿入するデータをdata
というArray型の変数に宣言しています。
例えば、自分の場合、以下のようなコードが書かれています。
<?php
use Migrations\AbstractSeed;
class UsersSeed extends AbstractSeed
{
/**
* Run Method.
*
* Write your database seeder using this method.
*
* More information on writing seeds is available here:
* http://docs.phinx.org/en/latest/seeding.html
*
* @return void
*/
public function run()
{
$data = [
[
'id' => '1',
'login' => 'admin',
'password' => 'XXX',
'role' => 'admin',
'name' => 'James'
],
[ //以下省略
3. MySQLを空にする
テーブルのデータをTRUNCATE
で空にします。
TRUNCATE TABLE users;
/*念の為、レコード数が0になっているか確認*/
SELECT count(*) FROM users;
次に、いよいよSeedingを実行します。
4. Seedingを実行し、 MySQLにデータを挿入する
生成したSeedファイルを以下で実行。
# 以下ですべてのSEEDを実行
$ bin/cake migrations seed
# UsersSeed.phpだけを実行する場合、以下を実行
$ bin/cake migrations seed --seed UsersSeed
実行後、再度Users
テーブルをSELECTして見ると、データが戻っていることが確認できます。
5. Migrations migrateを実行し、MySQLにデータを挿入する
次に、Migrations migrate
のみを実行し、Seedingを行います。
まず、Step3と同様に、TRUNCATE TABLE users;
でUsersテーブルのレコードを空にします。
/config/Migrations/
の配下に、新たに以下のようなMigrationファイルを作成します。
ファイル名: 20191210063412_SeedUsers.php
<?php
use Cake\Datasource\ConnectionManager;
use Migrations\AbstractMigration;
use Migrations\Migrations;
/**
* SeedUsers Migrations
*/
class SeedUsers extends AbstractMigration
{
public function up()
{
//ここで、SeedUsersという接続オブジェクトを定義
ConnectionManager::setConfig("SeedUsers", ConnectionManager::getConfig("default"));
//UsersSeedを以下のコードで実行
$migration = new Migrations();
$migration->seed(['seed' => 'UsersSeed', 'connection' => 'SeedUsers']);
}
public function down()
{
//Rollbackした際に、テーブルをTRUNCATEする
$this->execute('TRUNCATE TABLE users');
}
}
これで、migrations migrate
を実行するだけで、データが挿入できる準備が整いました。ちなみにファイル名の頭につく20191210063412
は現在の時間(Timestamp)を表しています。手動で作成する際は気をつけてください。
Phinxlog
に、実行後レコードが追加されているのが、わかります。
Rollbackする際は、Phinxlog
でversion
コラムを確認し、戻したいVersionまで戻ることができます。
20191210063412_SeedUsers.php
で、Rollbackの際はテーブルをTRUNCATEするようdown()
で定義しているので、戻すとTRUNCATEが実行され、レコードが無くなります。Rollbackは以下のコマンドで実行できます。
$bin/cake migrations rollback -t <version>
最後に
以上、CakePHPで開発、テスト用に初期データを仕込むやり方を説明しました。