前回の記事でLaravelの基本となるMVCパターンとArtisan makeコマンドについて説明しました。
今回はArtisanコマンドを使ってデータベース上のテーブルを作成・変更・削除する方法をお伝えします。
初心者にはとっつきづらいDB操作ですが、SQLを使わずにデータベースを操作できますので、とても便利です。
最初は覚えることも多いので少し時間がかかるかもしれませんが、一連のコマンド操作に慣れると、スピードと便利さを実感できると思います。
それでは、コマンドの種類を実際に使いながら覚えていきましょう。
目次
- Laravelのマイグレーション機能とは?
- マイグレーションファイルの作成
- マイグレーションの書き方:テーブルの作成
- マイグレーションの書き方:テーブルの変更
- マイグレーションの取り消し(ロールバック)
- 最後に
1. Laravelのマイグレーション機能とは
マイグレーションとは英語で「移動・移行」を意味する言葉です。
Laravelのマイグレーション機能では、まずマイグレーションファイルというphpファイルを作成して、その中にアプリケーションで利用したいテーブルの定義(カラムの名前・データ型・制約など)を記述します。
マイグレーションファイルはデータベースの設計書のようなもので、設計書を記述し終わった後でArtisan migrateコマンドを実行すると、Laravelがその内容をもとに自動でデータベースを構成します。
SQLが書けなくてもデータベースを作れるのは、とても便利ですね。
その他にも、Laravelのマイグレーション機能にはシーダーやテスト用ダミーデータの自動生成など便利な機能がたくさんありますが、今回は基本となるテーブルの作成・変更・ロールバックをメインに説明いたします。
2. マイグレーションファイルの作成
マイグレーションファイルは、Artisan make:migrationコマンドを実行することで、はじめから用意されている雛形を元に自動で生成することができます。
Artisan make:migrationコマンドは前回の記事で説明しましたので、本記事ではコマンドのみ紹介いたします。
まずLaravelプロジェクト(PROJECT_NAME)に移動して、以下のコマンドを実行します。
# Laravelプロジェクト(PROJECT_NAME)に移動
cd ~/html/laravel/PROJECT_NAME
# マイグレーションファイルの生成
php-7.1 artisan make:migration <ファイル名> -create=<テーブル名>
e.g) php-7.1 artisan make:migration create_hello_table –create=hello
今回はテーブルを新しく作成するためのオプションに --create=<テーブル名>をつけて実行しています。
オプションを指定すると、操作するテーブル名(今回の場合はhello)や操作の内容に合わせた雛形が最初から記述された状態でマイグレーションファイルが生成されます。
成功すると、マイグレーションファイルがdatabase/migrations/の直下に作成されます。
3. マイグレーションファイルの書き方:テーブルの作成
「2」で、生成したマイグレーションファイルはこのまま実行することもできますが、実行する前にカラム定義を書き加えることで、思いどおりの構造のテーブルを作ることができます。
3.1 マイグレーションファイルの編集
まずはマイグレーションファイルをテキストエディタで開きます。
database/migrations/<作成日時>_create_hello_table.php
public function up()
{
Schema::create(‘hello’, function( Blueprint $table) {
$table->increments('id');
$table->string('hello'); //varchar型のカラム「hello」を作成する
$table->string('world'); //「world」を作成する
$table->timestamps();
});
}
「2」のコマンドを実行して生成されたマイグレーションファイルにはupとdownという2つのメソッドがあらかじめ用意されています。
upはマイグレーションを実行する時の処理、downはマイグレーションをロールバックする時に実行される処理です。
upメソッドの中にあるSchema::createは第一引数に指定した名称のテーブルを作成するためのプロシージャで、実際に作るテーブルのカラム定義などは第二引数のfunctionの中に記述します。
今回は可変長文字列型のカラム「hello」「world」を作成するように指定しています。
その他に、よく使うデータ型の記述方法には以下のようなものがあります。
固定長文字列型(char)
$table->char('hello', 20)
可変長文字列型(varchar)
$table->string('hello')
整数型(int)
$table->integer('hello')
日時型(datetime)
$table->dateTime('hello')
タイムスタンプ型(timestamp)
$table->timestamp ('hello')
※雛形に最初から記述されている$table->timestamps()とは異なります。
$table->timestamps()はテーブルに登録日時と更新日時を記録するカラムを追加するための定義です。
3.2 マイグレーション実行
3.1 で内容を変更したマイグレーションファイルを使って、実際にデータベースを構成します。
作成するためのコマンドはArtisan migrationです。
# マイグレーションの実行
php-7.1 artisan migrate
上記のコマンドを実行すると、まだデータベースに反映を行っていないマイグレーションファイルがすべて実行されます。
今回は「create_hello_table」のマイグレーション実行が目的なので、以下のメッセージが出力されれば成功です。
Migrated: <作成日時>_create_hello_table
マイグレーションに成功したら、「hello」「world」カラムを持つ「hello」テーブルがデータベースに追加されます。
4. マイグレーションファイルの書き方:テーブルの変更
Laravelのマイグレーション機能を使って、既に作成したテーブルやカラムの名前・データ型・制約などを変更する方法を説明します。
テーブルの変更も3.と同じようにマイグレーションファイルを作成するのですが、すでに実行したマイグレーションファイルを編集するのではなく、毎回新しいマイグレーションファイルを生成するという点にご注意ください。反映済みのマイグレーションファイルを編集して再実行するためにはロールバックする必要がありますので、今回はロールバック不要の方法を説明します。
4.1 Doctrine DBALのインストール(初回のみ)
まず準備として、Doctrine DBALというパッケージをLaravelにインストールする必要があります。
インストール方法は、Laravelをインストールした時と同じようにComposerを使います。
php-7.1 ../composer.phar require doctrine/dbal
このパッケージをインストールすることで、Laravelのマイグレーション機能を使ってカラムの変更や削除をすることが可能になります。
4.2 マイグレーションファイルの作成
Artisan make:migration コマンドで新しいマイグレーションファイルを生成します。
手順および注意事項は2.と同様です。
php-7.1 artisan make:migration update_hello_table --table=hello
4.3 マイグレーションファイルの編集
マイグレーションファイルをテキストエディタで開いて編集します。
<作成日時>_update_hello_table.php
public function up()
{
Schema::table('hello', function (Blueprint $table) {
$table->string('hello', 20)->change(); //バイト長の制約を追加
$table->renameColumn('world', 'laravel'); //カラム名を変更
$table->integer('suuji')->nullable(); //整数型のカラム「suuji」を追加
});
}
upメソッドの中にあるSchema::tableは第一引数に指定した名称のテーブルを操作するためのプロシージャで、実際に変更するテーブルのカラム定義などは第二引数のfunctionの中に記述します。
$table->renameColumnは、カラム名を変更するためのメソッドで、第一引数に変更前の名前、第二引数に変更後の名前を設定します。
カラムのデータ型・制約を変更する場合や、新しいカラムを追加する場合は、新規作成と同じようにカラム名を引数にして$tableの各種メソッドを呼び出します。
既にレコードが存在するテーブルのカラムを変更する場合は、レコードが不整合を起こさないかLaravelがチェックを行って、不整合を起こす場合はガードがかかってマイグレーションが失敗するようになっています。
4.4 マイグレーション実行
php-7.1 artisan migrate
Migrated: <作成日時>_update_hello_table
と表示されれば、マイグレーションは成功です。
マイグレーションに成功したら、「hello」テーブルのカラム定義が変更されます。
5. マイグレーションの取り消し(ロールバック)
Laravelのマイグレーションには、実行したマイグレーションを取り消したり、データベースをある時点での状態に戻したりすることができるロールバック機能が含まれています。
ロールバックを行うコマンドは以下のような種類があります。
前回のマイグレーションをロールバック
php-7.1 artisan migrate:rollback
前回実行したマイグレーション(1件分)を取り消します。
編集したマイグレーションファイルに間違いがあった時などによく使います。
複数のマイグレーションをロールバック
php-7.1 artisan migrate:rollback --step=<数字>
現時点からさかのぼって、<数字>件分のマイグレーションを取り消します。
あまり使いません。
全マイグレーションのロールバック
php-7.1 artisan migrate:reset
すべてのマイグレーションを取り消します。
これまでマイグレーション機能で作成したテーブルはすべて削除されます。
全マイグレーションをロールバックしてから順にマイグレーションを実行する
php-7.1 artisan migrate:refresh
すべてのテーブルを削除して、初めから順番にマイグレーションを実行します。
全テーブルのレコードを削除するのと同じです。
開発用に登録したテストデータを削除する際などに便利です。
※テーブルの削除について
マイグレーションが世代管理という方式をとっているため、ロールバック機能で特定のテーブルだけを削除するということはできません。
特定のテーブルを削除したい場合は、4.の変更の手順と同じように、テーブルを削除するためのマイグレーションファイルを作成してマイグレーションを実行してください。
6. 最後に
今回の記事では、Laravelのマイグレーション機能についてご紹介しました。
このマイグレーション機能は、シーディング機能と組み合わせると、特に開発環境やテスト環境で絶大な効果を発揮しますので、次回はシーダーの作成とテスト用ダミーデータの自動生成についてご紹介したいと思います。