6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel6】ユーザー招待機能の詳細設計と実装(2)マイグレーションファイルからのテーブル作成

Last updated at Posted at 2022-12-19

はじめに

ユーザー招待機能の詳細設計と実装(2) マイグレーションファイルからのテーブル作成 について投稿します。

Web業界実務未経験での転職活動用にポートフォリオとしてはじめて作成したWebアプリ開発のオリジナルの機能として 家族ユーザー招待機能 を実装したときのものです。
※ 作成したポートフォリオは、絵本を読み聞かせしたことの記録・管理を、家族と共有できるWebアプリケーションです(作成期間は、2021年2月末〜7月)

投稿内容(全5回)

本連載は以下の順番で投稿します。

今回は、ユーザー招待機能の詳細設計と実装(2) DBのテーブル についてです。 Laravel のマイグレーション機能を使って、データベースに invites テーブルを作成します。

目次

以下、本記事の目次です。

  1. マイグレーションファイルの作成
  2. マイグレーションファイルの編集
  3. マイグレーションの実行
  4. テーブルの作成状況の確認

使用技術、サービスなど

  • PHP 7.4.13
  • Laravel 6.20.20
  • MySQL 8.0.23
  • MailHog(開発者向けのメールテストツール、開発環境)

マイグレーションとは

マイグレーションとは、データベースにテーブルを作成したり、既存のテーブルにカラム(項目)を追加したりといった、データベース内の定義を変更する機能です。

Laravel を使ってデータベースにテーブルを作成するには、まずマイグレーションファイルを作成する必要があります。

家族ユーザー招待に必要なデータを保存するために、Invites テーブルを用意します。

テーブルを必要とする理由は、どの家族(family_id)が、誰(email)を招待したかと、その招待 URL に利用するトークン(token)を保存するためです。

1. マイグレーションファイルの作成

以下のコマンドを実行して、マイグレーションファイルを作成します。

docker-compose exec app php artisan make:migration create_invites_table --create=invites

コマンドを実行すると、database/migrations/ ディレクトリに、以下のファイルが作成されます。

作成:database/migrations/2021_06_09_180935_create_invites_table.php
<?php

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

class CreateInvitesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('invites', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('invites');
    }
}

2. マイグレーションファイルの編集

家族ユーザー招待機能で利用するテーブルの定義を確認して、コマンド実行で作成されたマイグレーションファイルを編集します。

2-1. テーブル定義の確認

家族ユーザー招待機能で利用するテーブルの定義は以下のとおりです。

カラム名 データ型 役割・備考
id INTEGER 招待メール発行を管理するID
family_id INTEGER 招待した側のファミリーID
email VARCHAR(255) 招待された側のメールアドレス
token VARCHAR(16) 招待メールのトークン
created_at TIMESTAMP 作成日時
updated_at TIMESTAMP 更新日時

どの家族(family_id)が、誰(email)を招待したかと、その招待 URL に利用するトークン(token)を保存します。

2-2. マイグレーションファイルの編集

マイグレーションファイルを編集します。

編集:database/migrations/2021_06_09_180935_create_invites_table.php
<?php

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

class CreateInvitesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('invites', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('family_id');
            $table->string('email');
            $table->string('token', 16)->unique();
            $table->timestamps();

            $table->foreign('family_id')
                ->references('id')
                ->on('families');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('invites');
    }
}

マイグレーションファイルでカラムを定義するには、 $table->カラムの属性('カラム名'); と記述します。

マイグレーションを実行すると、このマイグレーションファイルが使用され、設定したカラムを持った invites テーブルが作成されます。

2-3. 参考

使用できるカラムタイプ

使用できるさまざまなカラムタイプがある。

コマンド 説明
$table->bigIncrements('id'); 符号なしBIGINTを使用した自動増分ID(主キー)
$table->unsignedBigInteger('votes'); 符号なしBIGINTカラム
$table->string('name', 100); 文字長を指定したVARCHARカラム
$table->timestamps(0); 有効(全体)桁数指定でNULL値可能なcreated_atとupdated_atカラム追加

unique メソッド

uniqueメソッドを使うことで、そのカラムにユニーク制約を付ける。ユニーク制約とは、テーブル内で他のレコードと同じ値を重複させないという制約。

invites テーブルについては、 token を重複させないため、ユニーク制約を追加している。

外部キー制約

family_id については、カラムを作成するだけでなく、外部キー制約を付けている。

$table->foreign('family_id')
    ->references('id')
    ->on('families');

上記は、「 invites テーブルの family_id カラムは、 families テーブルのidカラムを参照すること」という制約になる。

外部キー制約を付けることで、「発行された招待用トークンがどの家族への招待でもない」という状態を作れないようにしている。

3. マイグレーションの実行

以下のコマンドで、マイグレーションを実行します。

docker-compose exec app php artisan migrate

4. テーブルの作成状況の確認

以下コマンドを実行して、テーブルの作成状況を確認します。

docker-compose exec db bash -c 'mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE'

※ 以下の環境を利用している場合のコマンドです

実行時ログ
# r_yamate @ mbp in ~/Documents/code/Yonde-app on git:doc/mod_erd x [7:23:52]
$ docker-compose exec db bash -c 'mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE'
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.29 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql> SHOW COLUMNS FROM invites;
+------------+-----------------+------+-----+---------+----------------+
| Field      | Type            | Null | Key | Default | Extra          |
+------------+-----------------+------+-----+---------+----------------+
| id         | bigint unsigned | NO   | PRI | NULL    | auto_increment |
| family_id  | bigint unsigned | NO   | MUL | NULL    |                |
| email      | varchar(255)    | NO   |     | NULL    |                |
| token      | varchar(16)     | NO   | UNI | NULL    |                |
| created_at | timestamp       | YES  |     | NULL    |                |
| updated_at | timestamp       | YES  |     | NULL    |                |
+------------+-----------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

おわりに

今回は、ユーザー招待機能の詳細設計と実装(2) マイグレーションファイルからのテーブル作成 についてでした。
次回は、(3) 招待メール送信処理 についてです。

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

参考

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?