americandog1993の日記

プログラマー歴半年のメモ

CakePHPでマイグレーションしてみる

mysqlに入って直接createせずにcakeコマンドでテーブルを作ってみる。

環境

CentOS7
CakePHP3
MySQL 5.7

マイグレーション

ブログチュートリアルのarticlesテーブルをマイグレーションしてみる。

$ bin/cake bake migration CreateArticles id title:string body:text created modified
2017-08-14 10:54:00 Error: [PDOException] SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'id' in /var/www/html/blog_tutorial/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php on line 338

idカラムは最初からあるのでカラム設定する必要ないっぽい。
というか入れるとすでにあるんですけどってエラーになる。
やり直し。

$ bin/cake bake migration CreateArticles title:string body:text created modified

できたマイグレーションファイルが以下。

<?php
use Migrations\AbstractMigration;

class CreateArticles extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     * @return void
     */
    public function change()
    {
        $table = $this->table('articles');
        $table->addColumn('title', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('body', 'text', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('created', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('modified', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->create();
    }
}

createdとmodifiedはカラム名だけで察してくれて勝手に設定してくれる様子。
これを実行するには

$ bin/cake migrations migrate

と叩く。
これでテーブルが生成される。

補足 ブログチュートリアル注意点

このテーブル設定のままブログチュートリアル

INSERT INTO articles (title,body,created)
    VALUES ('タイトル', 'これは、記事の本文です。', NOW());
INSERT INTO articles (title,body,created)
    VALUES ('またタイトル', 'そこに本文が続きます。', NOW());
INSERT INTO articles (title,body,created)
    VALUES ('タイトルの逆襲', 'こりゃ本当にわくわくする!うそ。', NOW());

のクエリを実行しようとするとmodifiedカラムのNOT NULLに引っかかる。
その場合は以下のINSERT文に直して対応。

INSERT INTO articles (title,body,created,modified)
    VALUES ('タイトル', 'これは、記事の本文です。', NOW(), NOW());
INSERT INTO articles (title,body,created,modified)
    VALUES ('またタイトル', 'そこに本文が続きます。', NOW(), NOW());
INSERT INTO articles (title,body,created,modified)
    VALUES ('タイトルの逆襲', 'こりゃ本当にわくわくする!うそ。', NOW(), NOW());

補足2 Herokuでマイグレーションする

$ heroku run bash

でHerokuのコマンドラインに入れるので、

~ $ bin/cake migrations migrate

と叩く。