【Laravel入門】マイグレーションファイルでDB操作を行う

## はじめに
こんにちは、[Ebata](https://twitter.com/ebaryo_)です。

ドメイン駆動設計を学ぶ上で、データベース設計も一度振り返っておこうと思い書いていきます。

備忘録的な記事ですので、読みにくい部分があるかも知れませんが、ご了承の上でお読みください。

また、当方も学習中の身なので間違いなどありましたらご指摘いただけますとありがたいです。LGTMなどもよろしくお願いします。

## マイグレーションとは

そもそも「マイグレーションって何？」と言うところから書いていきましょう。Laravelの公式リリースノートには、以下のように解説されていました。

<strong>マイグレーションとは</strong>
[>> Laravel公式リリースノートより](https://readouble.com/laravel/8.x/ja/migrations.html)
> マイグレーションはデータベースのバージョン管理のようなもので、チームがアプリケーションのデータベーススキーマを定義および共有できるようにします。ソース管理から変更を取得した後に、ローカルデータベーススキーマにカラムを手動で追加するようにチームメートに指示する必要があったことを経験していれば、データベースのマイグレーションにより解決される問題に直面していたのです。

データベーススキーマとは、データベースの構造設計などのことであり、 Laravelにおいてマイグレーションとはこのデータベース設計を行い、共有することを可能にする機能としています。

つまり、データベースに格納するテーブルやカラムなどをSQL文を直に書かずに定義できるのです。

## マイグレーションファイルを作成する

まずはターミナルで、`php artisan`コマンドを実行し、マイグレーションファイルを作成していきましょう。

```
$ php artisan make:migration create_users_table
```

これで`database/migrations`ディレクトリに`○○_create_users_table.php`（○○はファイル作成日時）が作成されたはずです。

作成時のマイグレーションファイルの中身は以下です。

```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宣言

```create_users_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
```

使用するファザードやオブジェクトの`namespace`を記述します。

このファイルで何が使われているかを明示的に宣言するわけですね。これをしないと、Laravelはエラーを吐くので注意。

:::note info
ちなみにファザードやオブジェクトは、いくつかの処理をまとめたものです。
:::

[>> namespace一覧](https://laravel.com/api/5.8/)

### クラスの作成

```create_users_table.php
class new class extends Migration
{
  //
}
```

`Migration`から継承し、クラスが作られます。

PHPは7系から『無名宣言』という必殺技が導入され、クラス名を定義しなくてもよくなりました。これにより、使い切りのクラスは命名しなくても大丈夫に。

Laravel8系では、`php artisan`コマンドでマイグレーションファイルを作成すると、自動で無名宣言するようになっています。

### `up`メソッド

Laravelのマイグレーションファイルを作成すると、`up`メソッドと`down`メソッドが作られます。

`up`メソッドでは、データベースに対して

+ テーブルの追加
+ カラムの追加
+ インデックスの追加

などの`INSERT`系の操作を行います。

`down`メソッドでは、`up`メソッドと逆の操作をして以前の状態へと戻します。

基本的に`up`メソッドに処理を書きます。

```create_users_table.php
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        //ここでカラムなどを定義していく
        $table->id();
        $table->timestamps();
    });
}
```

`Schema`はファザード、`Blueprint`はオブジェクトです。先程`use宣言`したものをここで使用しています。

`Schema::create`はファザードでのみ許される書き方ですが、インスタンスを生成しなくてよいだけでクラスとなんら変わりません。

これにはサービスコンテナと呼ばれる技術が使われているのですが、解説すると長くなるので割愛します。気になる方は以下の記事を読んでみてください。

[>> 【Laravel】サービスコンテナとは？２つの強力な武器を持ったインスタンス化マシーン。簡単に解説。](https://qiita.com/minato-naka/items/afa4b930a2afac23261b)

そして、この中にデータベースに行う操作を書いていきます。マイグレーションファイル作成時には、`$table->id();`と`$table->timestamps();`の2行が書かれています。

`$table->`は、`Blueprint`で定義された書き方です。お約束だと思ってとりあえず書きましょう。

## 例題

長々と座学を続けてしまいましたが、実際に書いた方が理解できると思います。

簡単な例として、以下のようなテーブルを作りたいとしましょう。（格納されているデータは期待する値です）

<strong>usersテーブル</strong>
| 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`メソッドにコードを書いていきましょう。

```diff_php
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のフォローをよろしくお願いします。