🔄

Laravel マイグレーション(migration)について

2023/07/24に公開

マイグレーションとは

主にMySQLなどのリレーショナルデータベースを操作します。マイグレーションは、データベースのスキーマ(テーブルやカラムの定義など)を定義および変更するためのLaravelの機能です。

マイグレーションを使用してデータベースの変更を行うことにより、データベースの構造変更やデータの追加、変更、削除などの情報がファイルに記録されます。そのため、変更の履歴や内容を共有することができるのでm変更の履歴が明確になります!
https://readouble.com/laravel/11.x/ja/migrations.html

マイグレーションの生成

php artisan make:migration create_<テーブル名>_table

database/migrationsに新しい2021_03_25_123456_create_<テーブル名>_table.phpのファイルが生成されていることを確認してください。

2021_03_25_123456といったタイムスタンプは、artisan make:migrationコマンドを使用してマイグレーションファイルを生成する際に自動的に付与されます。

オプション

--table オプション

特定の既存テーブルに対して変更を加えるマイグレーションを作成するために使用します。

このオプションを使用すると、マイグレーションファイルには指定したテーブルに対する変更を行うためのテンプレートが自動的に生成されます

php artisan make:migration create_<テーブル名>_table --table=<テーブル名>

--create オプション

新しいテーブルをデータベースに追加するためのマイグレーションファイルを作成します。

このオプションを使用すると、新しいテーブルを作成するための基本的なマイグレーションファイルが生成され、テーブルを定義するためのスケルトンコードが含まれます。

php artisan make:migration create_<テーブル名>_table --create=<テーブル名>

マイグレーションファイルの命名規則

新しいテーブルを作成する場合

create_<テーブル名>_table

既存のテーブルにカラムを追加する場合

add_カラム名_to_<テーブル名>_table

複数のカラムを追加する場合
add_columns_to_<テーブル名>_table

既存のテーブルからカラムを削除する場合

remove_カラム名_from_<テーブル名>_table

複数のカラムを削除する場合
remove_columns_to_<テーブル名>_table

テーブル構造を変更する場合

update_<テーブル名>_table

モデル作成時にマイグレーションファイルを同時作成する

最後に-mを付けることで、モデルファイル作成時にmigrationファイルとcontrollerファイルが同時に作成されます!

php artisan make:model <モデル名> -m

マイグレーションファイル

upメソッド

migrationを実行したDBのスキーマを変更するための手順を記述します。

downメソッド

upメソッドで行ったスキーマの変更を逆に実行するコードを記述します。

例えば、データベースのスキーマを変更するマイグレーションを実行した後に問題が発生した場合、downメソッドを使用して変更を元に戻したり、取り消し操作を行うことができます。

ちなみにここでのスキーマとは、DBの構造や設計、テーブル、カラム、関数、制約などの定義を指します。

例えば$table->string('name');はデータベースのテーブルに新しい文字列型のカラムを追加するためのメソッドです。この例では、カラム名を'name'としています。

主なメソッド

メソッド データ型 説明
string VARCHAR 可変長の文字列
text TEXT 大きなテキストデータを格納する
increments 符号なしINT 1から始まり、次のレコードは2、3と自動的に増加する整数。自動的に主キーとして設定されます
integer int 整数
boolean 真偽値 真偽値(trueまたはfalse)
char 文字列 指定した長さの文字列を格納するカラム
date date 日付
dateTime dateTime 日付と時間が「YYYY-MM-DD HH:MM:SS」の形式で年、月、日、時、分、秒の情報が含まれています。
timestamp timestamp 現在の日時
timestamps timestamps 作成日(created_at)と更新日(updated_at)を作成する

他にも string('board_title', 40)とすると、文字数を最大40文字までに制限することができます。

データ型のVARCHARとTEXTの違い

VARCHARとTEXTの選択は、格納するデータの予測されるサイズによって異なります。

VARCHARの使用例

ユーザー名のカラムを作成する際には、VARCHARが適しています。

一般的なユーザー名の長さは比較的短いので例えば、VARCHAR(50)のカラムを作成すると、最大で50文字までのユーザー名を格納でき、ユーザーが50文字よりも短い名前にした場合には使用されるメモリは名前の長さに応じて調整されます。すなわち、ストレージスペースを節約したい場合に適しています。

TEXTの使用例

ブログの本文や記事のコンテンツなど、大きなテキストデータを格納する場合には、TEXTが適しています。
メモリ使用量は固定であり、テキストの長さに関係なく一定です。

データベースカラムに制約を追加するためのメソッド

メソッド 使用例 説明
first string('name')->first() 指定したカラムのテーブルの最初のカラムに設定する
after string('name')->after('email') 指定したカラムの次にカラムを追加する
unique string('email')->unique() 同じ値がデータベーステーブルの指定したカラムに重複して保存されることを防ぐ
change string('email')->nullable()->change() カラムの属性を変更する
comment text('content')->comment('blog') カラムにコメント追加する
default string('status')->default('active') カラムのデフォルト値を設定する
nullable string('email')->nullable() NULL値をデフォルトでカラムに挿入する
nullable string('email')->nullable(false) NULL値を許容しない

マイグレーションの実行

マイグレーションを実行してテーブルの作成/変更を行ってください。

php artisan migrate

マイグレーションファイルの内容がデータベースに反映されます。設定した通りにテーブルが作成されているか確認してください。

カラムの構造を確認する方法

MySQLに入り、以下のコマンドでテーブルに含まれるカラムの情報を取得する確認することができます。

SHOW COLUMNS FROM <テーブル名>;

またはデータベース管理ツールのphpMyAdminにログイン後、テーブルを選択し、「構造」タブを選択するとテーブルの構造を見ることができます。

phpMyAdminについては以下の記事でインストール方法を説明しています!
非常に便利なのでインストールしていない方は是非この機会にインストールして使ってみるのがおすすめです!
https://zenn.dev/nenenemo/articles/5222abfa1f6736

テーブルにカラムを追加する

migrationファイルを作る

php  artisan make:migration add_column_<追加したいカラム名>_to_<テーブル名>_table --table=<テーブル名>

#sail環境
sail   artisan make:migration add_column_<追加したいカラム名>_to_<テーブル名>_table --table=<テーブル名>

database/migrationsに作成されたmigrationファイルに以下を追記します。
usersはテーブル名、nameは追加したいカラム名です。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
```php
return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('name'); #追記
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('name'); #追記
        });
    }
};

afterメソッドを使用することで、指定したカラムの後に新しくカラムを追加することができます。

migrationの実行

php artisan migrate

#sail環境
sail artisan migrate

テーブルにカラムが追加されているか確認する。

テーブルのカラムの属性を変更する

migrationファイルの作成

php  artisan make:migration change_column_type_<属性を変更したいカラム名>_to_<テーブル名>_table --table=<テーブル名>

#sail環境
sail   artisan make:migration change_column_type_<属性を変更したいカラム名>_to_<テーブル名>_table --table=<テーブル名>

database/migrationsに作成されたmigrationファイルに以下を追記します。
今回の例では、必須項目だったnameというカラムでnullを許容するように変更します。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
```php
return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
              $table->integer('name')->nullable()->change(); #追記
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->integer('name')->change(); #追記
        });
    }
};

migrationの実行

php artisan migrate

#sail環境
sail artisan migrate

カラムの属性を変更されているか確認する。

テーブルのカラムを削除する

migrationファイルを作る

php artisan make:migration drop_column_<削除したいカラム名>_column --table=<テーブル名>

#sail環境
sail artisan make:migration drop_column_<削除したいカラム名>_column --table=<テーブル名>

database/migrationsに作成されたmigrationファイルに以下を追記します。
usersはテーブル名、nameは削除したいカラム名です。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('name'); #追記
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('name'); #追記
        });
    }
};

migrationの実行

php artisan migrate

#sail環境
sail artisan migrate

テーブルのカラムが削除されているか確認する。

ソフトデリート(論理削除)

ソフトデリートとは、データを削除する際に実際にデータを削除するのではなく、削除についてのカラムを作成し、そのカラムに有効か有効ではないかを判断する値を入れることで削除扱いにできるようにする機能のことです。

マイグレーションファイルに$table->softDeletes();を以下のように追記します。

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('employees', function (Blueprint $table) {
            $table->softDeletes(); #追記
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('employees', function (Blueprint $table) {
            $table->dropSoftDeletes(); #追記
        });
    }
};

自動的にデータベーステーブルにdeleted_atカラムが追加されるので確認してください。

次にモデルに以下を追記してください。

app/Models/User.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; #追記する

class User extends Model
{
    use SoftDeletes; #追記
}

これでこのモデルを使用してレコードを削除すると、deleted_atカラムに削除時のタイムスタンプが設定されるようになります。

削除されたデータは含めずに取得する場合にはwhereNullメソッドを使用します。

// deleted_atカラムがNULLのレコードのみが取得され、削除されたデータは含まれない
User::whereNull('deleted_at')->get();

https://qiita.com/kuropp/items/b7c6c068a90ec7bdcd73

Nothing to migrate

マイグレーションが既に実行されている場合に再度マイギュレーションを実行すると表示されると思います。

これは同じマイグレーションを以前に実行していた場合、データベース内migrationsテーブルにその記録が残っているためです。

マイグレーションファイルの状態をリセットする

すべてのマイグレーションがロールバックされます。

sail artisan migrate:reset

特定のマイグレーションだけをロールバックしたい場合

sail artisan migrate:rollback

マイグレーションの状態を確認

sail artisan migrate:status

下記が表示されます。

  Migration name ..... Batch / Status  
  0001_01_01_000000_create_users_table  [1] Ran  
  0001_01_01_000001_create_cache_table  [1] Ran  
  0001_01_01_000002_create_jobs_table  [1] Ran  
  2024_05_29_181223_add_columns_to_users_table  [2] Ran

Migration name

マイグレーションのファイル名です。

Batch

この数値は、そのマイグレーションが適用されたバッチ番号を示します。Laravelでは、一度に複数のマイグレーションをグループ化して実行でき、それぞれのグループがバッチとして扱われます。

バッチ番号は実行の順序を示し、ロールバックを行う際にどのマイグレーションが一緒にロールバックされるかを決定するのに使用されます。

Statu

マイグレーションがデータベースに適用されたかどうかを示します。
Ranはそのマイグレーションが既に実行されており、データベースに変更が適用されていることを意味します。

終わりに

何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉

Discussion