初めてのLaravel 5.1 : (8) マイグレーションの作成

これから簡単なブログを作成することを目的に、記事用のArticlesテーブルを作成してみます。

マイグレーションの作成

マイグレーションファイルは artisan make:migration コマンドで作成します。

php artisan make:migration マイグレーション名

マイグレーション名は、作成されるマイグレーションのファイル名と、その中で定義されるクラス名で使用されます。

では、実際に実行してみます。

php artisan make:migration create_articles_table

マイグレーションファイルは database/maigrations フォルダに作成ます。マイグレーションの実行順をフレームワークに知らせるため、ファイル名にタイムスタンプが付与されます。

database/
  └── migrations
          └── 2015_02_22_133752_create_articles_table.php
<?php
//  2015_02_22_133752_create_articles_table.php

use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateArticlesTable extends Migration {

    public function up()
    {
        //
    }

    public function down()
    {
        //
    }

}

Migrationクラスを継承した、CreateArticlesTableクラスが作成されています。make:migration した時に指定した、マイグレーション名をキャメルケースに変換したものがクラス名になっています。

内容には、中身が未定義の up(), down()メソッドが作成されました。

ここでは、テーブルの作成が行いたいので、make:maigrationに –create オプションを指定してマイグレーションを作成します。
一旦先ほどの 2015_02_22_133752_create_articles_table.phpを削除し、再度 –create オプション付きで make:migrate を行います。–createオプションには作成したテーブル名を指定します。なお、テーブル名は慣例的に複数形で命名します。

php artisan make:migration create_articles_table --create=articles
<?php
// 2015_02_22_133821_create_articles_table.php

use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateArticlesTable extends Migration {

    public function up()
    {
        Schema::create('articles', function(Blueprint $table)
        {
            $table->increments('id');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('articles');
    }

}

今度はup()と down()に、スキーマービルダーの記述を入れてファイルを生成してくれました。
up() の中に、テーブル作成処理が入り、idとタイムスタンプ項目が定義されています。
down() には、テーブルの削除処理が入っています。

ここで、Articlesテーブルに必要なtitleと body項目をテキストエディタで追加します。

<?php
// 2015_02_22_133821_create_articles_table.php

    // ...
    public function up()
    {
        Schema::create('articles', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('title');        // 追加
            $table->text('body');           // 追加
            $table->timestamps();
        });
    }
    // ...
}

スキーマビルダーの詳細な使い方は下記のサイトを参照してください。
http://laravel.com/docs/5.1/migrations#writing-migrations

では、マイグレーションを実行します。

$ php artisan migrate

Migrated: 2015_02_22_150438_create_articles_table

sqlite3 コマンドを使って、テーブルが作成されているか確認してみます。

$ sqlite3 storage/database.sqlite 

sqlite> .tables
articles migrations  password_resets  users

sqlite> .schema articles
CREATE TABLE "articles" (
    "id" integer not null primary key autoincrement,
    "title" varchar not null,
    "body" text not null,
    "created_at" datetime not null,
    "updated_at" datetime not null
);          

Articlesテーブルが作成されました!


テーブルの変更

今度はマイグレーションでテーブルを変更してみます。Articleテーブルに published_at 項目を追加します。

方法は2つ有ります。1つ目は、一旦ロールバックして、マイグレーションファイルに項目を追加してから、再度マイグレーションを実行する方法です。2つ目は、項目追加用のマイグレーションファイルを作成して、マイグレーションを実行する方法です。ここでは、2つ目の方法を試してみます。

テーブルの変更を行うファイルを作成するには make:migrationに –table オプションを付けて実行します。

php artisan make:migration add_published_at_to_articles_table --table=articles
<?php
// 2015_02_22_153343_add_published_at_to_articles_table.php

use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class AddPublishedAtToArticlesTable extends Migration {

    public function up()
    {
        Schema::table('articles', function(Blueprint $table)
        {
            //
        });
    }

    public function down()
    {
        Schema::table('articles', function(Blueprint $table)
        {
            //
        });
    }
}

新しいマイグレーションファイルが作成されました。
up(), down() ともにテーブルスキーマ変更処理(Schema::table)が入っています。
ここで、published_at 項目を追加します。
up() には項目の追加を、down() には項目の削除を支持します。

<?php
// 2015_02_22_153343_add_published_at_to_articles_table.php

    // ...
    public function up()
    {
        Schema::table('articles', function(Blueprint $table)
        {
            $table->timestamp('published_at')->nullable();
        });
    }

    public function down()
    {
        Schema::table('articles', function(Blueprint $table)
        {
            $table->dropColumn('published_at');
        });
    }
}

では、マイグレーションを実行します。

$ php artisan migrate

Migrated: 2015_02_22_153343_add_published_at_to_articles_table

sqlite3 コマンドを使って、テーブルに項目が追加されているか確認してみます。

$ sqlite3 storage/database.sqlite 

sqlite> .schema articles
CREATE TABLE "articles" (
    "id" integer not null primary key autoincrement,
    "title" varchar not null,
    "body" text not null,
    "created_at" datetime not null,
    "updated_at" datetime not null,
    "published_at" datetime null
);          

Articlesテーブルに published_at が追加されました!


まとめ

以下のことが出来るようになりました。

  • マイグレーションファイルの作成
  • テーブルの作成
  • テーブルの変更

追記

マイグレーションファイルで dropColumn(項目削除)を使った時に、エラーとなるトラブルに見舞われました。
その解決方法は以下の記事を参照してください。

artisan migrate で dropColumnがエラーになりハマる

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中