これから簡単なブログを作成することを目的に、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(項目削除)を使った時に、エラーとなるトラブルに見舞われました。
その解決方法は以下の記事を参照してください。