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());