Laravel Authで実装した認証機能の初回登録時にオリジナルカラムデータの保存に対応する。

# 目的

- ユーザの初回登録時にデフォルトでは存在していないカラムへ自動的に値を格納する方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# 前提情報

- 下記のどちらか、または下記に準ずる方法でAuthを用いたユーザ認証機能のあるLaravelアプリが存在していること。
    - [Mac Laravel 7 Authを用いたユーザ登録 ログイン ログアウトなどの機能を作成する](https://qiita.com/miriwo/items/5d4a94e8d2aa06b61530)
    - [Mac Laravel 7 Authを用いたユーザ登録 ログイン ログアウトなどの機能を作成する ver 2.0](https://qiita.com/miriwo/items/a15127a0421bb63a2617)
- そのアプリは既存マイグレーションファイルのマイグレートが完了していること。
- 今回紹介する手順の中で実行するカラムは`$ laravel new`コマンドで作成されたアプリ名ディレクトリ内で実行するものとする。

# 実施したい事

- Authの認証に使用されるusersテーブルは初期状態で下記のカラムで構成されている。

    ```mysql
    mysql> show columns from users;
    +-------------------+-----------------+------+-----+---------+----------------+
    | Field             | Type            | Null | Key | Default | Extra          |
    +-------------------+-----------------+------+-----+---------+----------------+
    | id                | bigint unsigned | NO   | PRI | NULL    | auto_increment |
    | name              | varchar(255)    | NO   |     | NULL    |                |
    | email             | varchar(255)    | NO   | UNI | NULL    |                |
    | email_verified_at | timestamp       | YES  |     | NULL    |                |
    | password          | varchar(255)    | NO   |     | NULL    |                |
    | remember_token    | varchar(100)    | YES  |     | NULL    |                |
    | created_at        | timestamp       | YES  |     | NULL    |                |
    | updated_at        | timestamp       | YES  |     | NULL    |                |
    +-------------------+-----------------+------+-----+---------+----------------+
    ```
- この情報にプラスしてサービスを使用するユーザが結婚しているかどうかのデータを格納する「marriage_flag」カラムを追加する。
- 「marriage_flag」カラムは次の条件で作成する。(カラム名: marriage_flag　データ型: int NULLの許容: しない 初期値:0)

    ```mysql
    +-------------------+-----------------+------+-----+---------+----------------+
    | Field             | Type            | Null | Key | Default | Extra          |
    +-------------------+-----------------+------+-----+---------+----------------+
    | marriage_flag     | int             | NO   |     | 0       |                |
    +-------------------+-----------------+------+-----+---------+----------------+
    ```
- カラム設定でも初期値を指定するが、ユーザ登録シーケンス内でもアプリ側で値を格納するように処理を行う。
- 「marriage_flag」は０が格納されている時は未婚、1が格納されている時は既婚、2が格納されている時はその他をお見する。

# 概要

1. カラムの追加
1. 登録処理の値追加
1. 確認

# 概要

1. カラムの追加
    1. 下記コマンドを実行してマイグレーションファイルを作成する。

        ```terminal
        $ php artisan make:migration add_marriage_flag_column_to_users_table --table=users
        ```
    1. 下記コマンドを実行して先に作成したマイグレーションファイルを開く(yyyy_mm_ddはマイグレーションファイルの作成日)

        ```terminal
        $ vi database/migrations/yyyy_mm_dd_XXXXXX_add_marriage_flag_column_to_users_table.php
        ```
    1. 開いたマイグレーションファイルを下記の様に修正しする。

        ```アプリ名ディレクトリ/database/migrations/yyyy_mm_dd_XXXXXX_add_marriage_flag_column_to_users_table.php
        <?php
        
        use Illuminate\Database\Migrations\Migration;
        use Illuminate\Database\Schema\Blueprint;
        use Illuminate\Support\Facades\Schema;
        
        class AddMarriageFlagColumnToUsersTable extends Migration
        {
            /**
             * Run the migrations.
             *
             * @return void
             */
            public function up()
            {
                Schema::table('users', function (Blueprint $table) {
                    //下記を追記する
                    $table->integer('marriage_flag')->default(0);
                });
            }
        
            /**
             * Reverse the migrations.
             *
             * @return void
             */
            public function down()
            {
                Schema::table('users', function (Blueprint $table) {
                    //下記を追記する
                    $table->dropColumn('marriage_flag')->default(0);
                });
            }
        }
        ```
    1. 下記を実行してマイグレーションを実行する。

        ```terminal
        $ php artisan migrate
        ```
1. 登録処理の値追加
    1. 下記コマンドを実行してユーザ登録時に実行されるコントローラファイルを開く。

        ```terminal
        $ vi app/Http/Controllers/Auth/RegisterController.php
        ```
    1. 開いたコントローラファイルを下記の様に修正して初期値を指定する。

        ```アプリ名ディレクトリ/app/Http/Controllers/Auth/RegisterController.php
        <?php
        
        namespace App\Http\Controllers\Auth;
        
        use App\Http\Controllers\Controller;
        use App\Providers\RouteServiceProvider;
        use App\User;
        use Illuminate\Foundation\Auth\RegistersUsers;
        use Illuminate\Support\Facades\Hash;
        use Illuminate\Support\Facades\Validator;
        
        class RegisterController extends Controller
        {
            /*
            |--------------------------------------------------------------------------
            | Register Controller
            |--------------------------------------------------------------------------
            |
            | This controller handles the registration of new users as well as their
            | validation and creation. By default this controller uses a trait to
            | provide this functionality without requiring any additional code.
            |
            */
        
            use RegistersUsers;
        
            /**
             * Where to redirect users after registration.
             *
             * @var string
             */
            protected $redirectTo = RouteServiceProvider::HOME;
        
            /**
             * Create a new controller instance.
             *
             * @return void
             */
            public function __construct()
            {
                $this->middleware('guest');
            }
        
            /**
             * Get a validator for an incoming registration request.
             *
             * @param  array  $data
             * @return \Illuminate\Contracts\Validation\Validator
             */
            protected function validator(array $data)
            {
                return Validator::make($data, [
                    'name' => ['required', 'string', 'max:255'],
                    'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
                    'password' => ['required', 'string', 'min:8', 'confirmed'],
                ]);
            }
        
            /**
             * Create a new user instance after a valid registration.
             *
             * @param  array  $data
             * @return \App\User
             */
            protected function create(array $data)
            {
                return User::create([
                    'name' => $data['name'],
                    'email' => $data['email'],
                    'password' => Hash::make($data['password']),
                    //下記を追加する
                    'marriage_flag' => 0,
                ]);
            }
        }
        ```
1. 確認
    1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

        ```terminal
        $ php artisan serve
        ```
    1. 下記にアクセスする。
        - [http://127.0.0.1:8000/register](http://127.0.0.1:8000/register)
    1. ユーザの新規登録を行う。
    1. 下記コマンドを実行してターミナルからMySQLにログインする。
   
        ```terminal
        $ mysql -u root -p
        ```
    1. 下記を実行してデータベース名の一覧を出力する。

        ```mysql
        mysql> show databases;
        ```
    1. 下記を実行してLaravelアプリで使用しているDBを指定する。

        ```mysql
        mysql> use データベース名;
        ```
    1. 下記を実行してusersテーブルのデータを出力する。

        ```mysql
        mysql> select * from users;
        ```
    1. 新規登録したレコードのmarriage_flagカラムに0が格納されている事を確認する。