Magicode logo
Magicode
6 min read

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

https://cdn.apollon.ai/media/notebox/blob_CaChjrP

はじめに

こんにちは、わーくまん(https://twitter.com/work_man_9) です。
ドメイン駆動設計を学ぶ上で、データベース設計も一度振り返っておこうと思い書いていきます。
備忘録的な記事ですので、読みにくい部分があるかも知れませんが、ご了承の上でお読みください。
また、当方も学習中の身なので間違いなどありましたらご指摘いただけますとありがたいです。LGTMなどもよろしくお願いします。

マイグレーションとは

そもそも「マイグレーションって何?」と言うところから書いていきましょう。Laravelの公式リリースノートには、以下のように解説されていました。
マイグレーションとは >> 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テーブル
idnamecreated_atupdated_at
1田中1999-09-09 09:09:09null
2山田2022-02-22 22:22:222022-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のフォローをよろしくお願いします。

Discussion

コメントにはログインが必要です。