【Laravel】マイグレーションの書き方とコマンドとは?ファイル作成から更新まで
この記事からわかること
- Laravelのマイグレーションとは?
- 書き方や実行方法
- マイグレーションのメリット
- シーディングの意味と使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
phpのフレームワークLaravelにはデータベースを管理する機能が常設されています。
今回はその機能「マイグレーション」の意味と使い方をまとめていきたいと思います。
マイグレーション(Migration)とは?
マイグレーション(Migration)とはLaravelに備わっているデータベースを管理できる機能のことです。運用環境が変更になった時に使用していたデータベースを新しい環境で最初から構築し直すのは大変です。その煩わしさを解消するために作られた機能がマイグレーションになります。
Migrationを日本語に訳すと「移行」という意味になります。名称からも分かる通りマイグレーションのメリットはデータベース移行が簡単に実行できることです。
Laravelではスクリプトファイルを生成し、そこに必要事項を書き込んで実行するだけでデータベースのテーブル作成を行うことができます。
このスクリプトファイルを保存しておき、作成したい時に実行することで何度でもコマンド1つで該当のデータテーブルを構築することができます。
マイグレーション(Migration)とは?〜まとめ〜
- マイグレーションとはデータベースを簡単に移行できる機能のこと
- 環境が変わった時に構築しなくて済む
- コマンドを入力するだけで何度でも作成可能
マイグレーションの手順
マイグレーションを使ってデータベース(テーブル)を作成する手順をまとめておきます。
- テーブル作成用のスクリプトファイルの生成
- スクリプトファイルにカラムを列挙
- コマンドラインでスクリプトを実行
手順はこの3つでOKです。操作するのはコマンドラインとLaravelプロジェクト内のファイルに対してです。
スクリプトファイルの作成
まずはコマンドラインでテーブルを作成するためのスクリプトファイルを作成します。作成するのはartisan(アルチザン/アーティザン)
のmake:migration
コマンドです。
artisan(アルチザン/アーティザン)
を実行するためにカレントディレクトリを作成したLaravelプロジェクトにしておきます。
$ cd Laravelプロジェクト名
$ php artisan make:migration create_customer_table
Created Migration: 2021_11_25_104235_create_customer_table
これで「プロジェクト」>「database」>「migrations」の中に上記のような「日付_create_テーブル名_table.php」というファイルが作成されます。
この日付はマイグレーションが実行される時の順序を決めるタイムスタンプになっているようです。古い日時のものから先に実行される感じですかね!
「日付_create_テーブル名_table.php」には既に以下のようなコードが記述された状態で作成されます。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCustomerTable extends Migration
{
public function up()
{
Schema::create('customer', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('customer');
}
}
概要は以下の通りです。
- use文で必要な機能をインポート
- Migrationクラスを継承したクラスを生成
- 中には2つのメソッド
- それぞれのメソッドには必要最低限のコード
マイグレーションの設定をするために変更するのは2つのメソッドの中身です。まずは2つのメソッドがどのようなものかを把握しておきます。
マイグレーションのメソッド
- upメソッド :テーブルを生成するためのメソッド
- downメソッド:テーブルを削除するためのメソッド
テーブルを生成するupメソッド
の中に作成したいカラム(column)を記述することでマイグレーションが実行された時に列挙したカラムが自動で生成されます。
downメソッド
はテーブルを削除する時に使用するメソッドです。基本的に中身は変更しなくてもOKです。
デフォルトに設定しているデータベースとは別のデータベースで処理を行いたい場合、$connectionプロパティ
の値を変更すれば変更することができます。
class CreateCustomerTable extends Migration
{
protected $connection = 'pgsql';
public function up()
{
スクリプトファイルにカラムを列挙
続いて実際に使用したいデータベースの構造をupメソッドの中に記述します。欲しい項目(カラム)を中に記述するだけでOKです。
実行するのは、Schemaファザード
の静的メソッドcreate
の役割です。ファザードとはクラスのような認識で良いと思います。createメソッド
の第1引数に作成したいテーブル名、第2引数に関数で構造部分を記述します。
作成したいデータベース:customerテーブル
id | name | age |
---|---|---|
1 | デザイン太郎 | 25 |
今回はこのようなテーブルを作りたいので以下のように記述します。
public function up()
{
Schema::create('customer', function (Blueprint $table) {
$table->increments('id');
$table->string('name',15);
$table->integer('age');
$table->timestamps();
});
}
カラム部分を記述するのはBlueprintクラス
のメソッドを使います。メソッドはカラムに保存させたいデータ型を指定します。例えば文字ならstring
といった感じです。
$table->メソッド('カラム名');
Blueprintクラスのメソッドの種類
メソッド | データ型や意味 |
---|---|
increments | オートインクリメント |
integer | 整数 |
string | 文字列 |
boolean | 真偽地 |
dataTime | 日時 |
他にもメソッドはたくさんありますが、代表的なものをまとめてみました。データベースを作成したことがある人ならなんとなく分かると思います。
公式リファレンス:カラムメソッドの種類
$table->timestamps();
ここではtimestampsメソッド
を使用しています。このメソッドを実行することでcreated_at
とupdated_at
というカラムが自動で追加されます。作成日時と更新日時を司る項目のことです。
upメソッドはマイグレーションを実行したタイミングで自動で実行されるのでここで一旦終了です。
コマンドラインでスクリプトを実行
これでマイグレーションを実行する準備は整いました。続いて実行処理をしていきます。
Macであればデフォルトで使えるはずのSQLiteを使用して実行してみたいと思います。まずはデータベースの元となるファイルを作成します。ターミナルを開いて以下のコードを打ち込みます。touchコマンド
は指定した名前の空のファイルを作成できるコマンドです。
$ cd Laravelプロジェクト名
$ touch database/database.sqlite
これで「database」内に「database.sqlite」ファイルが生成されました。次に実際に実行するphp artisan migrate
コマンドを入力していきます。
$ php artisan migrate
Migration table created successfully.
Migrating: 日付_create_users_table
Migrated: 日付_create_users_table (1.07ms)
Migrating: 日付_create_password_resets_table
Migrated: 日付_create_password_resets_table (0.57ms)
Migrating: 日付_create_failed_jobs_table
Migrated: 日付_create_failed_jobs_table (0.60ms)
Migrating: 日付_create_personal_access_tokens_table
Migrated: 日付_create_personal_access_tokens_table (0.89ms)
Migrating: 日付_create_customer_table
Migrated: 日付_create_customer_table (0.37ms)
上記のようにMigration table created successfully.
と出れば処理は成功です。これで指定したカラム構造を持ったデータベーステーブルが「database.sqlite」ファイル内に生成されました。
実行コマンドをすることで作成したスクリプトファイルだけでなく、「プロジェクト」>「database」>「migrations」内にデフォルトで用意されていたスクリプトファイルも実行されたと思います。これらはマイグレーションに必要な処理を勝手に実行してくれているのです。
マイグレーションに関するコマンド一覧
migrate:status
マイグレーションが正常に行われているかどうかはmigrate:status
で確認できます。このコマンドは今までに実行したマイグレーションを表示してくれます。
$ php artisan migrate:status
+------+-------------------------------------------------------+-------+
| Ran? | Migration | Batch |
+------+-------------------------------------------------------+-------+
| Yes | 日付_create_users_table | 1 |
| Yes | 日付_create_password_resets_table | 1 |
| Yes | 日付_create_failed_jobs_table | 1 |
| Yes | 日付_create_personal_access_tokens_table | 1 |
| Yes | 日付_create_people_table | 1 |
+------+-------------------------------------------------------+-------+
migrate:rollback
migrate:rollback
はマイグレーションをロールバックするコマンドです。ロールバックとはデータベースの更新時にエラーが起きた時などに更新処理を無かったことにして前の状態に戻ることを指します。このコマンドを実行することでバッチ単位で処理を戻すことができます。
$ php artisan migrate:rollback
ステップ数を指定することで指定した数分のマイグレーション処理をロールバックすることもできます。
$ php artisan migrate:rollback --step=3
シーディングの作成
マイグレーションを実行することで希望のカラム(列)を持ったテーブルを作成できましたが、まだレコード(行:データ部分)が空っぽです。
そこでシード(あらかじめ作成しておくデータ)を作成することでテーブルが正常に機能しているかの確認やテストが簡単に行えるようになります。
シードの作成方法もマイグレーションと同じような流れで進んでいきます。
- シード作成用のシーダーファイルの生成
- シーダーファイルにシードを列挙
- シーダーファイルを登録
- コマンドラインでシーディングを実行
シード作成用のスクリプトファイルの生成
まずはプロジェクトファイルに移動し、そこでシーディングを実行できるシーダーファイルを作成します。
$ cd Laravelプロジェクト名
$ php artisan make:seeder CustomerTableSeeder
これで「プロジェクト」>「database」>「seeders」の中に指定した名前の「XxxxxxTableSeeder.php」が作成されます。
開いてみると以下のようなコードが記述されたファイルになっています。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class CustomerTableSeeder extends Seeder
{
public function run()
{
//
}
}
中にはrunメソッド
が1つだけ用意されています。このrunメソッド
の中にあらかじめ用意しておきたいシードを記述しておけば、シーディングを実行した時に自動でレコードが生成されます。
シーダーファイルにシードを列挙
では実際にシードを記述してみます。
まず元々あったuse文の下に1行追加しておきます。データベースを簡単に操作できるDBクラス
をファイル内で使用できるようにインポートしておきます。
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; // 追加
続いてレコードを記述していきます。変数$param
の中に連想配列でデータを格納し、それをDBクラスのinsertメソッド
で入れ込みます。
public function run()
{
$param = [
'name' => 'デザイン太郎',
'age' => 25,
];
DB::table('customer')->insert($param);
$param = [
'name' => 'デザイン花子',
'age' => 34,
];
DB::table('customer')->insert($param);
$param = [
'name' => 'エンジニアたかし',
'age' => 56,
];
DB::table('customer')->insert($param);
}
シーダーファイルを登録
次はシーダーファイルが実行されるように「DatabaseSeeder.php」に登録をしていきます。シーディングを実行するとこのファイルが実行されます。なのでここに動作させたいシーダーファイルを記述しておかないと実行処理はされないのです。
そのファイルは作成したシーダーファイルと同じ「プロジェクト」>「database」>「seeders」の中にデフォルトで用意されています。
では「DatabaseSeeder.php」を開き記述していきます。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call(CustomerTableSeeder::class); // 追加
}
}
追記するのはrunメソッドの中の1行のみです。Seederクラスのcallメソッド
を呼び出し、引数に先ほど作成したシーダーファイルを指定しておきます。
コマンドラインでシーディングを実行
これで全ての準備が整いました。ターミナルでシーディングを実行してみます。
$ php artisan db:seed
Seeding: Database\Seeders\CustomerTableSeeder
Seeded: Database\Seeders\CustomerTableSeeder (12.68ms)
Database seeding completed successfully.
無事シーディングが完了しました。自分のデータベースの中を除いてみてください。レコードが挿入されているはずです。
公式リファレンス:Laravel:マイグレーション
まだまだ勉強中ですので間違っている点や至らぬ点がありましたらガンガン教えていただけると助かります。
ご覧いただきありがとうございました。