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

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

マイグレーションの作成

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

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

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

では、実際に実行してみます。マイグレーション名を create_テーブル名_table と指定することで、テーブル作成用のマイグレーションを生成してくれます。またテーブル名は複数形にするのが一般的です。

php artisan make:migration create_articles_table

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

database/
  └── migrations
          └── 2018_08_24_024919_create_articles_table.php
<?php
// 2018_08_24_024919_create_articles_table.php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

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

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

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

up() の中にはテーブル作成処理(Schema::create)が入り、idとタイムスタンプ項目が定義されています。
down() には、テーブルの削除処理が入っています。

ここで、Articles テーブルに必要な title と body 項目を追加します。

<?php
// 2018_08_24_024919_create_articles_table.php

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

項目追加の詳細な方法は下記のサイトを参照してください。
https://laravel.com/docs/5.6/migrations#columns

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

php artisan migrate

Migrating: 2018_08_24_024919_create_articles_table
Migrated:  2018_08_24_024919_create_articles_table

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

sqlite3 database/database.sqlite 

sqlite> .tables
articles migrations  password_resets  users

sqlite> .schema articles --indent
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
);

sqlite> .q

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


テーブルの変更

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

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

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

php artisan make:migration add_published_at_to_articles_table --table=articles
<?php
// 2018_08_24_031429_add_published_at_to_articles_table.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

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
// 2018_08_24_031429_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

Migrating: 2018_08_24_031429_add_published_at_to_articles_table
Migrated:  2018_08_24_031429_add_published_at_to_articles_table

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

sqlite3 database/database.sqlite 

sqlite> .schema articles --indent
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
);          

sqlite> .q

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


まとめ

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

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

追記

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

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

%s と連携中