laravel_マイグレーションについて学ぶ

06マイグレーションについて学ぶ

ここではマイグレーションについて学んでいきます。

マイグレーションとは?

migrationはDBの改編記録(どういうテーブルをつくったのか、どういうカラムを追加したのか?など)をしっかり残し、いつでもその改変を戻せるようにできる機能です。

また、Laravelの場合、わざわざSQLを叩かずともlaravelで用意されている形式でその設定を書くことで、わかりやすくテーブルの作成等ができるようになっています。

マイグレーションファイルを作成してみましょう

新しくターミナルを開き、以下のコマンドを実行してDockerコンテナ環境内にはいります。

docker exec -it lesson13_laravel-web-1 bash

その後、以下のコマンドによりlaravel_appの階層に移動してください。

cd laravel_app

※今後「php artisan」から始まるコマンドはすべてDockerコンテナ内のlaravel_appディレクトリの中で使用することを念頭に置いててください。

以下のコマンドでマイグレーションファイルを作成することができます。

//テーブルを作成するときのコマンド
php artisan make:migration create_テーブル名_table
//テーブルを削除するときのコマンド
php artisan migrate:rollback
//テーブルを作成してみる これを実行する
php artisan make:migration create_memos_table

実行できたら以下の画像のようにファイルが生成されたはずです。

database/migrationsの中に格納されています。

ファイルの中身を確認してみましょう。

※memo_table.php以外はデフォルトで格納されています。

<?php
use Illuminate\\Database\\Migrations\\Migration;
use Illuminate\\Database\\Schema\\Blueprint;
use Illuminate\\Support\\Facades\\Schema;
return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('memos', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('memo');
    }
};

ファイルに中にupメソッドとdownメソッドが存在します。

upメソッドについて

データベースに新しいテーブルやカラムなどを生成するための処理を記述する部分です。

デフォルトでidカラムとタイムスタンプの2つが既に記述されているので、その書き方にしたがって、追加したいカラムを記述していきます。

$table->id();
$table->timestamps();

1行目でidという名のカラムを作成するという意味です。テーブルを作成する時は必ずidを設定するようにしましょう。

idにはオートインクリメントという機能があり、自動で番号を振ってくれます。この数字はかぶることがなく、必ず一意になります。

2行目ではNULL値可能なcreated_atとupdated_atカラム追加しています。

cerate_atはtimestamps()というメソッドです。

自動的にcreated_atとupdated_atのカラムを作成されます。

レコードが追加されたときに自動的に現在の時間が格納されます。

また、後ほど説明しますが、update()メソッドを使用するとレコードが更新された際の時間がupdated_atに上書きされます。

では実際にupメソッドを編集し、追加カラムを変更してみましょう。

先ほど作成したマイグレーションファイルのupメソッド内を以下のように追記してください。

$table->id();
// この1行を追加してください
$table->string('content', '255');
$table->timestamps();

$table->string('content', '255');はテーブルにcontentという名前のカラムで255文字以内の文字列型が入るカラムを作成することを指定しています。

その他の利用可能なカラムタイプ

メソッド名説明
date()DATE(日付)カラムを作成する
integer()INTEGER(数値)カラムを作成する

さらに詳しくカラムアイプを知りたい方はこちら

マイグレーション 8.x Laravel

downメソッド

テーブルを削除するための処理を記述する部分で、rollbackを実行したときに走る用として書きます。

downメソッドは新規登録の場面では既に記述されていますが、カラムの追加や削除を行うときはdownメソッドにも記述する必要があります。

記述の仕方は簡単で、upメソッドに記述したカラムに対応したdropColumnを記述するだけです。

それではマイグレーションを実行し、テーブルを作成してみましょう

下記のコマンドをターミナルで実行してください。

php artisan migrate

ターミナルに以下画像のように出力されたら成功です。

次に、テーブルが作成されているかをターミナルで確認していきます。

下記のコマンドを入力してください。

// ターミナルが「mysql>」の状態になっていない場合は下記コマンドを実行
mysql -u root
// 使用するデータベースを選択
USE laravel_app
// テーブルの一覧を表示
SHOW TABLES;

※画像はmemoテーブルですが正しくはmemosテーブルです

memosテーブルが追加されていることが確認できました。

つづいて、memosテーブルの中身を確認しましょう。

DESCRIBE memos;

「id」「content」「created_at」「updated_at」の4つのカラムが作成されています。

「id」は$table->id();「content」は先ほど追加した$table->string('content', '255');「created_at」と「updated_at」は$table->timestamps();から作成されています。

補足:テーブルとそのカラム名一覧を一度に確認したい場合は、下記のコマンドを実行してください。

// テーブルとそのカラム名の一覧を表示
SELECT table_name, column_name, data_type FROM information_schema.columns WHERE table_schema = 'laravel_app';

シーダーとファクトリ

Migrationでは、テーブルの構造を定義することはできますが、そこにデータを入れることはできません。

そこで、Seeder(以下シーダー)とFactory(以下ファクトリ)の機能を使うことで開発者は手動でデータを挿入する必要がなく、初期データやテストデータを簡単に作成することができます。

それでは実際にシーダーとファクトリを使ってデータの作成を行ってみましょう。

シーダー

Laravelのプロジェクトを作成した時に、database/seeders/の中にDatabaseSeeder.phpファイルが作成されていますが、今回は新しくシーダークラスを作成してみましょう。

php artisan make:seeder シーダー名で新しくシーダークラスを作成できます。
今回は先ほど作成したMemosテーブルにデータを挿入してみましょう。
下記のコマンドをターミナルで実行してみてください。

php artisan make:seeder MemoSeeder

新しく作成されたMemoSeeder.phpファイルを確認してみましょう。

<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class MemoSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}

runメソッドの中に以下の内容を記載します。
また、use Illuminate\Support\Facades\DB;も追記しておきましょう。

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; // 追記
class MemoSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('Memos')->insert([
         'content' => 'メモ1',
     ]);
    }
}

これでMemosテーブルの中にデータを挿入する準備ができました。
後はコマンドを実行してみましょう!
下記のコマンドをターミナルで実行してみてください。

php artisan db:seed --class=MemoSeeder

下記のコマンドをターミナルで実行し、データの確認を行いましょう。

// ターミナルが「mysql>」の状態になっていない場合は下記コマンドを実行
mysql -u root
select * from Memos;

シーダーを使ってデータの挿入ができましたね。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です