はじめに
ドメイン駆動設計を学ぶ上で、データベース設計も一度振り返っておこうと思い書いていきます。
備忘録的な記事ですので、読みにくい部分があるかも知れませんが、ご了承の上でお読みください。
また、当方も学習中の身なので間違いなどありましたらご指摘いただけますとありがたいです。LGTMなどもよろしくお願いします。
マイグレーションとは
そもそも「マイグレーションって何?」と言うところから書いていきましょう。Laravelの公式リリースノートには、以下のように解説されていました。
マイグレーションはデータベースのバージョン管理のようなもので、チームがアプリケーションのデータベーススキーマを定義および共有できるようにします。ソース管理から変更を取得した後に、ローカルデータベーススキーマにカラムを手動で追加するようにチームメートに指示する必要があったことを経験していれば、データベースのマイグレーションにより解決される問題に直面していたのです。
データベーススキーマとは、データベースの構造設計などのことであり、 Laravelにおいてマイグレーションとはこのデータベース設計を行い、共有することを可能にする機能としています。
つまり、データベースに格納するテーブルやカラムなどをSQL文を直に書かずに定義できるのです。
マイグレーションファイルを作成する
まずはターミナルで、php artisan
コマンドを実行し、マイグレーションファイルを作成していきましょう。
$ php artisan make:migration create_users_table
これでdatabase/migrations
ディレクトリに○○_create_users_table.php
(○○はファイル作成日時)が作成されたはずです。
作成時のマイグレーションファイルの中身は以下です。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class new class extends Migration
{
/**
* マイグレーションの実行
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* マイグレーションを戻す
*
* @return void
*/
public function down()
{
Schema::drop('users');
}
}
少し難しそうに見えますが、分解して考えてみましょう。
use宣言
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
使用するファザードやオブジェクトのnamespace
を記述します。
このファイルで何が使われているかを明示的に宣言するわけですね。これをしないと、Laravelはエラーを吐くので注意。
:::note info
ちなみにファザードやオブジェクトは、いくつかの処理をまとめたものです。
:::
クラスの作成
class new class extends Migration
{
//
}
Migration
から継承し、クラスが作られます。
PHPは7系から『無名宣言』という必殺技が導入され、クラス名を定義しなくてもよくなりました。これにより、使い切りのクラスは命名しなくても大丈夫に。
Laravel8系では、php artisan
コマンドでマイグレーションファイルを作成すると、自動で無名宣言するようになっています。
up
メソッド
Laravelのマイグレーションファイルを作成すると、up
メソッドとdown
メソッドが作られます。
up
メソッドでは、データベースに対して
などのINSERT
系の操作を行います。
down
メソッドでは、up
メソッドと逆の操作をして以前の状態へと戻します。
基本的にup
メソッドに処理を書きます。
public function up()
{
Schema::create('users', function (Blueprint $table) {
//ここでカラムなどを定義していく
$table->id();
$table->timestamps();
});
}
Schema
はファザード、Blueprint
はオブジェクトです。先程use宣言
したものをここで使用しています。
Schema::create
はファザードでのみ許される書き方ですが、インスタンスを生成しなくてよいだけでクラスとなんら変わりません。
これにはサービスコンテナと呼ばれる技術が使われているのですが、解説すると長くなるので割愛します。気になる方は以下の記事を読んでみてください。
そして、この中にデータベースに行う操作を書いていきます。マイグレーションファイル作成時には、$table->id();
と$table->timestamps();
の2行が書かれています。
$table->
は、Blueprint
で定義された書き方です。お約束だと思ってとりあえず書きましょう。
例題
長々と座学を続けてしまいましたが、実際に書いた方が理解できると思います。
簡単な例として、以下のようなテーブルを作りたいとしましょう。(格納されているデータは期待する値です)
usersテーブル
id | name | created_at | updated_at |
---|
1 | 田中 | 1999-09-09 09:09:09 | null |
2 | 山田 | 2022-02-22 22:22:22 | 2022-02-23 23:23:23 |
まずは、php artisan
コマンドでcreate_users_table.php
を作成します。
$ php artisan make:migration create_users_table
これで、database/migrations
ディレクトリにマイグレーションファイルが作成されました。
続いて、マイグレーションファイルを開いてup
メソッドにコードを書いていきましょう。
public function up()
{
Schema::create('users', function (Blueprint $table) {
//ここでカラムなどを定義していく
+ $table->increments('id');
+ $table->string('name');
$table->timestamps();
});
}
increments
は、連続して増幅する数字を指定したい時に使います。今回のid
カラムには、1人目・2人目・3人目に対して、1・2・3と連続した数字を当てはめたいので、increments
を指定します。
2行目のstring
は、name
カラムに対して文字列データを格納したいので、型を宣言しています。
最後のtimestamps
は、自動的にcreated_at
カラムとupdated_at
カラムを作ってくれます。
これでマイグレーションファイルの編集は完了したので、マイグレーションを行っていきます。マイグレーションは以下のphp artisan
コマンドをターミナルで実行してください。
$ php artisan migrate
これでマイグレーションは完了です。
終わりに
少し長くなってしまいましたが、 Laravelのマイグレーションファイルについてのまとめは以上になります。
Laravelはデータベースとのやり取りがとても重要なフレームワークです(もはやそのためだけに使う場合もある)。
マイグレーションをマスターするには、多くの開発をするのが1番の近道だと思いますので、業務以外でも触ってみてください。
この記事が良かったと思う方は、ぜひLGTMとTwitterのフォローをよろしくお願いします。