CakePHP3.xでSeedを使ってデーターベースの初期値を作成する

/

導入

前回CakePHP3.3でマイグレーションを試してみましたが、マイグレーションはスキーマを登録するだけなので、それだけではデーターベースにデータ自体はまだ入力されていません。

開発やテストの際にアプリケーションが正常に作動しているかの検証ためにはマイグレーションだけでなくデータベースに実際にデータが入力されていて欲しいのですが、データベースに直接SQLコマンドを実行したりアプリケーションでフォームを作ってデータを登録するのは手間なのでSeedの機能を利用してデータベースの初期値を設定を試してみました。

参照
seed – Migration/CakePHP

実行環境

  • ubuntu 16.04
  • CakePHP 3.3
  • SQLite3

Seed

CakePHPのマイグレーションプラグインはデーターベースライブラリとしてPhinxが使われていました。PhinxにはSeedの機能があるのでCakePHPでもこれを利用してデーターベースの初期値を設定する事が出来ます。

1.5.5 より、データベースの初期データ投入のために migrations シェルが使用できます。 これは、 Phinx ライブラリの seed 機能 を利用しています。デフォルトで、seed ファイルは、あなたのアプリケーションの config/Seeds ディレクトリの中に置かれます。 seed ファイル作成のための Phinx の命令 を確認してください。
seed – Migration/CakePHP

シーダーの作成

データベースに入力したいデータを記述するためのシーダーはbakeコマンドから作成する事が出来ます。

# シーダーの作成
$ bin/cake bake seed Blogs
app/config/Seeds/BlogsSeed.php

コマンドを実行すると/config/Seeds/以下にシーダーが作成されます。

Migration

Seedを利用してデータベースにデータを書き込むには対応するテーブルやカラムが必要になるので、シーダーを編集する前にマイグレーションを実行してデーターベースのスキーマを設定します。

今回はサンプルとしてBlogsテーブルに

  • title: string
  • body: text
  • created: datetime

のカラムを設定します。
またこれらとは別にインデックスとしてIDが自動的に設定されています。

# マイグレーションファイルの作成
$ bin/cake bake migration CreateBlog title:string body:text created: datetime

# マイグレーションの実行
$ bin/cake migrations migrate

シーダーの編集

シーダーを編集してデータベースに書き込む初期値を設定します。

シーダーにはbakeコマンドを実行した時点で、指定した名前のテーブルにデータを書き込むコードが記述されているので、$dataに実際に渡したい値をリスト形式で記述していきます。

<?php
use Migrations\AbstractSeed;

class BlogsSeed extends AbstractSeed
{

    public function run()
    {
        $data = [
            [
                'title' => 'ポスト1',
                'body' => 'テスト ポスト', 
                'created' => date('Y-m-d H:i:s')
            ],
            [
                'title' => 'ポスト2',
                'body' => 'ふたつ目のテスト', 
                'created' => date('Y-m-d H:i:s')
            ],
            [
                'title' => 'ポスト3',
                'body' => 'これもテスト', 
                'created' => date('Y-m-d H:i:s')
            ]
        ];

        $table = $this->table('blogs');
        $table->insert($data)->save();
    }
}

Seedの実行

シーダーが設定出来たのでコマンドからSeedを実行していきます。

# シードの実行
$ bin/cake migrations seed

# もしくは
# 特定のシーダーを指定して実行
$ bin/cake migrations seed --seed BlogsSeed

Seedを実行したのでデーターベースを確認してみます。

# データーベースへ接続
$ sqlite3 app.sql
# テーブルの値を全て取得
select * from blogs;

1|ポスト1|テスト ポスト|2016-12-10 23:10:36
2|ポスト2|ふたつ目のテスト|2016-12-10 23:10:36
3|ポスト3|これもテスト|2016-12-10 23:10:36

Seedによってデーターベースに値が書き込まれています。

あとがき

前回マイグレーションでデーターベースの設定を行ったので、今度はデータの雛形を作成して実際にデータを書き込んでみました。

マイグレーションを試した時にも思った事ですが開発環境と本番環境で異なったデーターベースを使うとそれぞれ利用できるSQLコマンドの文法が異なる事があります。
一々コマンドを書き換えるのも手間ですし、データーベースに関してはSeedやMigrationを使ってなるべくアプリケーション側で処理すると再利用出来るものは使い回しが効くので便利そうです。