こんにちは!
今回はLaravelのマイグレーションをご紹介していきます。
「マイグレーションってそもそも何?」
「マイグレーションってどうやって使っていくの?」
このような疑問を持つ方に向けて、Laravelのマイグレーションを使ったDBの管理方法を詳しく解説していきます。
本記事を読めば、以下のようなことがわかります。
- マイグレーションとは何か
- マイグレーションの作成手順
- テーブルの作成・編集・削除方法
具体的にどのようにマイグレーションファイルを作成するのかなどは、サンプルコードを交えて解説していきます。
✔︎ 筆者の経験
・現役のWeb開発者
・Laravel歴3年
・複数の開発プロジェクトを経験
マイグレーションとは
そもそもマイグレーションとは、DBのテーブルを管理するためのLaravelに備わっている機能のことです。
マイグレーションを使うことで、Laravelからテーブルを作成したり、テーブルにカラムを追加したりなどを行うことができます。
マイグレーションの実行履歴はDBによって管理され、ファイル名にもいつマイグレーションファイルが作成されたのかなどが書かれているため、DBの変更履歴を追うことができるようになっています。
そのため、Laravelを使う場合は、基本的にDBはマイグレーションファイルで管理するのが一般的となっています。
以下は公式サイトになります。
https://readouble.com/laravel/10.x/ja/migrations.html
マイグレーションの流れ
以下のような流れでDBに反映します。
- マイグレーションファイルを作成
- マイグレーションファイルを編集
- マイグレーションを実行し、DBに反映
テーブル作成
このセクションでは、マイグレーションファイルからテーブル作成を行う方法を解説します。
マイレグレーションの生成
まずは、マイグレーションファイルの作成する必要があります。make:migration
コマンドにより、データベースマイグレーションを作成できます。テーブルを作成する場合は以下のようになります。
$ php artisan make:migration create_flights_table
上記サンプルコードは、flights
テーブルを作成する場合のコードです。
作成したいテーブル名に合わせて、コマンドを叩いてください。
作成したマイグレーションファイルは、「database/migrations/xxxx_xx_xx_xxxxxx_create_flights_table.php」のようなファイル名で作成されます。「xxxx_xx_xx_xxxxxx」となっているところは、作成した日時になっているはずです。
マイグレーションファイルの構造
マイグレーションファイル内にはupメソッドとdownメソッドがあります。
それぞれ、以下のような違いがあります。
upメソッド・・・テーブル、カラム、インデックスを追加するために使用される。
downメソッド・・・ロールバックを実行した時に使用される。以前の状態に戻す。
以下、サンプルコードです。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* マイグレーションの実行
*
* @return void
*/
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* マイグレーションを戻す
*
* @return void
*/
public function down()
{
Schema::drop('flights');
}
};
マイグレーションファイルが実行されたときに行いたい処理をup
メソッドに書きます。
戻したい場合は、ロールバックという操作を行うことでDBに反映した変更を戻すことができます。その際、実行されるのはdown
メソッドに書いた処理になります。ロールバックの実行方法は後ほど解説します。
マイグレーションファイルの編集
upメソッドの詳細を見てみましょう。
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('airline');
$table->timestamps();
});
}
以下の2行はデフォルトで作成されているはずです。
$table->id();
$table->timestamps();
これらはそれぞれ、レコードIDとレコード作成日時・更新日時です。timestamps()
の1行で作成日時カラムと更新日時カラムの2つを生成します。
以下の2行はそれぞれ、飛行機の機体名と航空会社名のカラムです。
$table->string('name');
$table->string('airline');
マイグレーションファイルの書き方としては、サンプルコードのようにデータ型とカラム名を記述します。
また、オプションとして以下のようにカラムにコメントをつけたり、NULL許可を行ったりすることもできます。
$table->string('name')->comment('機体名')->nullable();
$table->string('airline')->comment('航空会社名')->nullable();
他にもさまざまなオプションがあるので、気になる方は公式サイトを読んでおくと良いと思います。
down
メソッドの方は特に編集する必要はありませんが、以下のようにdrop
メソッドを使うことでロールバック時にテーブルを削除することができます。
public function down()
{
Schema::drop('flights');
}
マイグレーションの実行
さあ、マイグレーションファイルが作成できたら、実際にマイグレーションファイルのスクリプトを実行してみましょう!
マイグレーションを実行するには、migrate
コマンドを叩きます。
$ php artisan migrate
データベースを確認してみてください。
テーブルが作成されていることが確認できるかと思います。
カラム追加
流れやマイグレーションファイルの編集方法などはテーブル作成時と同じですが、使用するコマンドが若干違います。
$ php artisan make:migration add_pilot_to_flights
実行すると、以下のようにマイグレーションファイルを編集します。
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddPilotToTableName extends Migration
{
public function up()
{
Schema::table('flights', function (Blueprint $table) {
$table->string('pilot')->comment('機長名')->nullable();
});
}
public function down()
{
Schema::table('flights', function (Blueprint $table) {
$table->dropColumn('pilot');
});
}
}
あとは、テーブル作成時と同じようにマイグレーションを実行すれば、DBに反映されます。
$ php artisan migrate
マイグレーションの状態確認
どのマイグレーションが実行されているか確認したい場合は、migrate:status
コマンドを叩きます。
php artisan migrate:status
マイグレーションのロールバック
最新のマイグレーションをロールバックする(戻す)場合は、rollback
コマンドを叩きます。
$ php artisan migrate:rollback
これは、最新のマイグレーションのみロールバックすることに注意しましょう。
どれだけ戻すか指定してロールバックを行う場合は、—step
オプションで指定します。
$ php artisan migrate:rollback --step=5
上記コマンドの場合、最新5回分のマイグレーションをロールバックします。
全て戻したい場合はmigration:reset
コマンドを叩きます。
$ php artisan migrate:reset
ロールバックとマイグレーションを同時に行う
migrate:refresh
コマンドは、全てのマイグレーションをロールバックしてから、migrate
コマンドを再度実行します。
$ php artisan migrate:refresh
# データベースを真新しくし、データベースのシーダーを実行する
$ php artisan migrate:refresh --seed
ロールバックと同じく、特定の数を指定することが可能です。
$ php artisan migrate:refresh --step=5
migrate:fresh
コマンドは、データベースから全てのテーブルを削除したあと、migrate
コマンドを実行します。
$ php artisan migrate:fresh
$ php artisan migrate:fresh --seed
マイグレーション状態の管理
マイグレーションがどこまで進んでいるのか等はphp artisan migrate:status
で確認することができますが、そもそもなぜこのコマンドを実行すると、状態確認ができるのでしょうか?状態に関するデータは一体どこに持っているのでしょうか?
この答えは、実はDBにあります。
Laravelはデフォルトでmigrations
テーブルを持っており、ここにマイグレーションに関する状態のデータを保持しています。
この知識は必須ではありませんが、このような仕組みで管理しているということは頭の片隅に置いておいた方が良いと思います。
まとめ
いかがでしたでしょうか?
Laravelはマイグレーションファイルを使うことで、データベースのカラムやテーブルなどを簡単に操作することができます。また、DBへの変更をコードで管理することができ、実行履歴なども残すことできます。
マイグレーションは非常に便利な機能なので、ぜひ使いこなしていってほしいと思います。
忘れてしまったら、再度この記事を確認してみてください。
以上です。それでは、ご清聴ありがとうございました!!
参考
参考リンク
参考書籍
PHPフレームワークLaravel入門第2版 [ 掌田津耶乃 ]
コメント