【Laravel】マイグレーションの書き方とコマンドとは?ファイル作成から更新まで

この記事からわかること

  • Laravelマイグレーションとは?
  • 書き方実行方法
  • マイグレーションのメリット
  • シーディングの意味と使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

phpのフレームワークLaravelにはデータベースを管理する機能が常設されています。

今回はその機能「マイグレーション」の意味と使い方をまとめていきたいと思います。

マイグレーション(Migration)とは?

マイグレーション(Migration)とはLaravelに備わっているデータベースを管理できる機能のことです。運用環境が変更になった時に使用していたデータベースを新しい環境で最初から構築し直すのは大変です。その煩わしさを解消するために作られた機能がマイグレーションになります。

Migrationを日本語に訳すと「移行」という意味になります。名称からも分かる通りマイグレーションのメリットはデータベース移行が簡単に実行できることです。

Laravelではスクリプトファイルを生成し、そこに必要事項を書き込んで実行するだけでデータベースのテーブル作成を行うことができます。

このスクリプトファイルを保存しておき、作成したい時に実行することで何度でもコマンド1つで該当のデータテーブルを構築することができます。

マイグレーション(Migration)とは?〜まとめ〜

マイグレーションの手順

マイグレーションを使ってデータベース(テーブル)を作成する手順をまとめておきます。

  1. テーブル作成用のスクリプトファイルの生成
  2. スクリプトファイルにカラムを列挙
  3. コマンドラインでスクリプトを実行

手順はこの3つでOKです。操作するのはコマンドラインとLaravelプロジェクト内のファイルに対してです。

スクリプトファイルの作成

まずはコマンドラインでテーブルを作成するためのスクリプトファイルを作成します。作成するのはartisan(アルチザン/アーティザン)make:migrationコマンドです。

artisan(アルチザン/アーティザン)を実行するためにカレントディレクトリを作成したLaravelプロジェクトにしておきます。

$ cd Laravelプロジェクト名
$ php artisan make:migration create_customer_table
Created Migration: 2021_11_25_104235_create_customer_table

これで「プロジェクト」>「database」>「migrations」の中に上記のような「日付_create_テーブル名_table.php」というファイルが作成されます。

この日付はマイグレーションが実行される時の順序を決めるタイムスタンプになっているようです。古い日時のものから先に実行される感じですかね!

日付_create_テーブル名_table.php」には既に以下のようなコードが記述された状態で作成されます。

<?php

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

class CreateCustomerTable extends Migration
{
    public function up()
    {
        Schema::create('customer', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::dropIfExists('customer');
    }
}

概要は以下の通りです。

マイグレーションの設定をするために変更するのは2つのメソッドの中身です。まずは2つのメソッドがどのようなものかを把握しておきます。

マイグレーションのメソッド

テーブルを生成するupメソッドの中に作成したいカラム(column)を記述することでマイグレーションが実行された時に列挙したカラムが自動で生成されます。

downメソッドはテーブルを削除する時に使用するメソッドです。基本的に中身は変更しなくてもOKです。

デフォルトに設定しているデータベースとは別のデータベースで処理を行いたい場合$connectionプロパティの値を変更すれば変更することができます。

class CreateCustomerTable extends Migration
{
    protected $connection = 'pgsql';

    public function up()

    {

スクリプトファイルにカラムを列挙

続いて実際に使用したいデータベースの構造をupメソッドの中に記述します。欲しい項目(カラム)を中に記述するだけでOKです。

実行するのは、Schemaファザードの静的メソッドcreateの役割です。ファザードとはクラスのような認識で良いと思います。createメソッドの第1引数に作成したいテーブル名、第2引数に関数で構造部分を記述します。

作成したいデータベース:customerテーブル

id name age
1 デザイン太郎 25

今回はこのようなテーブルを作りたいので以下のように記述します。

public function up()
{
    Schema::create('customer', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name',15);
        $table->integer('age');
        $table->timestamps();
    });
}

カラム部分を記述するのはBlueprintクラスのメソッドを使います。メソッドはカラムに保存させたいデータ型を指定します。例えば文字ならstringといった感じです。

$table->メソッド('カラム名');

Blueprintクラスのメソッドの種類

メソッド データ型や意味
increments オートインクリメント
integer 整数
string 文字列
boolean 真偽地
dataTime 日時

他にもメソッドはたくさんありますが、代表的なものをまとめてみました。データベースを作成したことがある人ならなんとなく分かると思います。

公式リファレンス:カラムメソッドの種類

$table->timestamps();

ここではtimestampsメソッドを使用しています。このメソッドを実行することでcreated_atupdated_atというカラムが自動で追加されます。作成日時と更新日時を司る項目のことです。

upメソッドはマイグレーションを実行したタイミングで自動で実行されるのでここで一旦終了です。

コマンドラインでスクリプトを実行

これでマイグレーションを実行する準備は整いました。続いて実行処理をしていきます。

Macであればデフォルトで使えるはずのSQLiteを使用して実行してみたいと思います。まずはデータベースの元となるファイルを作成します。ターミナルを開いて以下のコードを打ち込みます。touchコマンド指定した名前の空のファイルを作成できるコマンドです。

$ cd Laravelプロジェクト名
$ touch database/database.sqlite

これで「database」内に「database.sqlite」ファイルが生成されました。次に実際に実行するphp artisan migrateコマンドを入力していきます。

$ php artisan migrate  

Migration table created successfully.
Migrating: 日付_create_users_table
Migrated:  日付_create_users_table (1.07ms)
Migrating: 日付_create_password_resets_table
Migrated:  日付_create_password_resets_table (0.57ms)
Migrating: 日付_create_failed_jobs_table
Migrated:  日付_create_failed_jobs_table (0.60ms)
Migrating: 日付_create_personal_access_tokens_table
Migrated:  日付_create_personal_access_tokens_table (0.89ms)
Migrating: 日付_create_customer_table
Migrated:  日付_create_customer_table (0.37ms)

上記のようにMigration table created successfully.と出れば処理は成功です。これで指定したカラム構造を持ったデータベーステーブルが「database.sqlite」ファイル内に生成されました。

実行コマンドをすることで作成したスクリプトファイルだけでなく、「プロジェクト」>「database」>「migrations」内にデフォルトで用意されていたスクリプトファイルも実行されたと思います。これらはマイグレーションに必要な処理を勝手に実行してくれているのです。

マイグレーションに関するコマンド一覧

migrate:status

マイグレーションが正常に行われているかどうかはmigrate:statusで確認できます。このコマンドは今までに実行したマイグレーションを表示してくれます。

$ php artisan migrate:status
+------+-------------------------------------------------------+-------+
| Ran? | Migration                                             | Batch |
+------+-------------------------------------------------------+-------+
| Yes  | 日付_create_users_table                                | 1     |
| Yes  | 日付_create_password_resets_table                      | 1     |
| Yes  | 日付_create_failed_jobs_table                          | 1     |
| Yes  | 日付_create_personal_access_tokens_table               | 1     |
| Yes  | 日付_create_people_table                               | 1     |
+------+-------------------------------------------------------+-------+

migrate:rollback

migrate:rollbackマイグレーションをロールバックするコマンドです。ロールバックとはデータベースの更新時にエラーが起きた時などに更新処理を無かったことにして前の状態に戻ることを指します。このコマンドを実行することでバッチ単位で処理を戻すことができます。

$ php artisan migrate:rollback

ステップ数を指定することで指定した数分のマイグレーション処理をロールバックすることもできます。

$ php artisan migrate:rollback --step=3

シーディングの作成

マイグレーションを実行することで希望のカラム(列)を持ったテーブルを作成できましたが、まだレコード(行:データ部分)が空っぽです。

そこでシード(あらかじめ作成しておくデータ)を作成することでテーブルが正常に機能しているかの確認やテストが簡単に行えるようになります。

シードの作成方法もマイグレーションと同じような流れで進んでいきます。

  1. シード作成用のシーダーファイルの生成
  2. シーダーファイルにシードを列挙
  3. シーダーファイルを登録
  4. コマンドラインでシーディングを実行

シード作成用のスクリプトファイルの生成

まずはプロジェクトファイルに移動し、そこでシーディングを実行できるシーダーファイルを作成します。

$ cd Laravelプロジェクト名
$ php artisan make:seeder CustomerTableSeeder

これで「プロジェクト」>「database」>「seeders」の中に指定した名前の「XxxxxxTableSeeder.php」が作成されます。

開いてみると以下のようなコードが記述されたファイルになっています。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class CustomerTableSeeder extends Seeder
{

    public function run()
    {
        //
    }
}

中にはrunメソッドが1つだけ用意されています。このrunメソッドの中にあらかじめ用意しておきたいシードを記述しておけば、シーディングを実行した時に自動でレコードが生成されます。

シーダーファイルにシードを列挙

では実際にシードを記述してみます。

まず元々あったuse文の下に1行追加しておきます。データベースを簡単に操作できるDBクラスをファイル内で使用できるようにインポートしておきます。

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; // 追加

続いてレコードを記述していきます。変数$paramの中に連想配列でデータを格納し、それをDBクラスのinsertメソッドで入れ込みます。

public function run()
{
    $param = [
        'name' => 'デザイン太郎',
        'age' => 25,
    ];
    DB::table('customer')->insert($param);

    $param = [
        'name' => 'デザイン花子',
        'age' => 34,
    ];
    DB::table('customer')->insert($param);

    $param = [
        'name' => 'エンジニアたかし',
        'age' => 56,
    ];
    DB::table('customer')->insert($param);
}

シーダーファイルを登録

次はシーダーファイルが実行されるように「DatabaseSeeder.php」に登録をしていきます。シーディングを実行するとこのファイルが実行されます。なのでここに動作させたいシーダーファイルを記述しておかないと実行処理はされないのです。

そのファイルは作成したシーダーファイルと同じ「プロジェクト」>「database」>「seeders」の中にデフォルトで用意されています。

では「DatabaseSeeder.php」を開き記述していきます。

<?php
  
namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
  
  public function run()
  {
    $this->call(CustomerTableSeeder::class); // 追加
  }
}

追記するのはrunメソッドの中の1行のみです。Seederクラスのcallメソッドを呼び出し、引数に先ほど作成したシーダーファイルを指定しておきます。

コマンドラインでシーディングを実行

これで全ての準備が整いました。ターミナルでシーディングを実行してみます。

$ php artisan db:seed
Seeding: Database\Seeders\CustomerTableSeeder
Seeded:  Database\Seeders\CustomerTableSeeder (12.68ms)
Database seeding completed successfully.

無事シーディングが完了しました。自分のデータベースの中を除いてみてください。レコードが挿入されているはずです。

公式リファレンス:Laravel:マイグレーション

まだまだ勉強中ですので間違っている点や至らぬ点がありましたらガンガン教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index