Laravel6 チェックボックスの値を受け取り保存する

# 目的

- Laravel6でチェックボックスの実装とtrue falseを受け取りそれに応じてデータベースのカラムに0か1を格納する

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 6.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 前提条件

- 実施環境に近い環境が構築されていること。（筆者は直接Macに環境を構築しているがLaravel6の動作環境なら基本本方法で確認可能である。）

# 前提情報

- Authを用いた認証機能があるLaravel6アプリがあること。
- usersテーブルに1つ以上のデータレコードが存在すること。
- Larvel6でチェックボックスを実装する。
- そのチェックボックスがチェックされているかいないかによってDBのusersテーブルのcheck_flagカラム」に格納する値を変更する。
- 「check_flagカラム」はチェックされていないと0、チェックボックスにチェックされていると1が入る。
- 「check_flagカラム」に1が入っていた時にチェックボックス入力ページのチェックボックスは最初からチェックがついた状態にする。

# 概要

1. カラム作成
1. ルーティング情報の記載
1. コントローラファイルの作成と記載
1. ビューファイルの作成と記載
1. 確認

# 詳細

1. カラム作成
    1. アプリ名ディレクトリで下記コマンドを実行してマイグレーションファイルを作成する。

        ```terminal
        $ php artisan make:migrate add_check_flag_columns_to_users_table --table=users
        ```
    1. 作成されたマイグレーションファイルを開き下記のように記載する。下記にはマイグレーションファイルの全内容を記載する。

        ```アプリ名ディレクトリ/database/migrations/YYYY_MM_DD_HHMMSS_add_check_flag_columns_to_users_table.php
        <?php
        
        use Illuminate\Database\Migrations\Migration;
        use Illuminate\Database\Schema\Blueprint;
        use Illuminate\Support\Facades\Schema;
        
        class AddCheckFlagColumnsToUsersTable extends Migration
        {
            /**
             * Run the migrations.
             *
             * @return void
             */
            public function up()
            {
                Schema::table('users', function (Blueprint $table) {
                    //
                    $table->tinyInteger('check_flag')->default(0)->after('password');
                });
            }
        
            /**
             * Reverse the migrations.
             *
             * @return void
             */
            public function down()
            {
                Schema::table('users', function (Blueprint $table) {
                    //
                    $table->dropColumn('check_flag');
                });
            }
        }
        ```
1. ルーティング情報の記載
    1. ルーティングファイルを開き、下記の3行を追記する。

        ```アプリ名ディレクトリ/routes/web.php
        Route::get('/input', 'TestController@input')->name('input');
        Route::post('/check_register', 'TestController@register')->name('check.register');
        Route::get('/output', 'TestController@output')->name('output');
        ```
1. コントローラファイルの作成と記載
    1. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを作成する。

        ```terminal
        $ php artisan make:controller TestController
        ```
    1. 作成されたファイルに下記の内容を記載する。下記にはコントローラファイルの全内容を記載する。

        ```アプリ名ディレクトリ/app/Http/Controllers/TestController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use Illuminate\Http\Request;
        use App\User;
        
        class TestController extends Controller
        {
            public function input()
            {
                $user_infos = User::select('*')->get();
                return view('tests.input', ['user_infos' => $user_infos]);
            }
        
            public function register(Request $request)
            {
                $input_data = $request->all();
           
                foreach ($input_data['user_id'] as $key => $value) {
                    $user_info = User::select('*')->find($key);
                    $user_info->check_flag = $value;
                    $user_info->save();
                }
                Log::info($request);
                return redirect(route('output'));
            }
        
            public function output()
            {
                $user_infos = User::select('*')->get();
                return view('tests.output', ['user_infos' => $user_infos]);
            }
        }
        ```
1. ビューファイルの作成と記載
    1. アプリ名ディレクトリで下記コマンドを実行してビューファイル格納用のディレクトリを作成する。

        ```terminal
        $ mkdir resources/views/tests
        ```
    1. input.blade.phpファイルとoutput.blade.phpファイルを`アプリ名ディレクトリ/resources/views/tests`直下に作成する。
    1. 先に作成した２つのビューファイルに下記の内容を記載する。
        - input.blade.php

            ```terminal
            input
            
            <form action="{{ route('check.register') }}" method="post">
                @csrf
                <table border="1">
                    <tr>
                        <th>チェックボックス</th>
                        <th>id</th>
                        <th>name</th>
                        <th>email</th>
                    </tr>
                    @foreach ($user_infos as $user_info)
                    <tr>
                        <input type="hidden" name="user_id[{{ $user_info['id'] }}]" value="0">
                        @if ($user_info['check_flag'] === 1)
                        <td><input type="checkbox" checked="checked" name="user_id[{{ $user_info['id'] }}]" value="1"></td>
                        @else
                        <td><input type="checkbox" name="user_id[{{ $user_info['id'] }}]" value="1"></td>
                        @endif
                        <td>{{ $user_info['id'] }}</td>
                        <td>{{ $user_info['name'] }}</td>
                        <td>{{ $user_info['email'] }}</td>
                    </tr>
                    @endforeach
                </table>
                <button type="submit">保存</button>
            </form>
            ````
        - output.blade.php

            ```terminal
            output
            <table border="1">
                <tr>
                    <th>チェックボックス</th>
                    <th>id</th>
                    <th>name</th>
                    <th>email</th>
                </tr>
                @foreach ($user_infos as $user_info)
                <tr>
                    @if ($user_info['check_flag'] === 1)
                    <td><input type="checkbox" checked="checked" name="user_id[]" value="{{ $user_info['id'] }}"></td>
                    @else
                    <td><input type="checkbox" name="user_id[]" value="{{ $user_info['id'] }}"></td>
                    @endif
                    <td>{{ $user_info['id'] }}</td>
                    <td>{{ $user_info['name'] }}</td>
                    <td>{{ $user_info['email'] }}</td>
                </tr>
                @endforeach
            </table>
            ````
1. 確認
    1. ローカルサーバを起動し下記にアクセスする。
        - [http://127.0.0.1:8000/input](http://127.0.0.1:8000/input)
    1. テーブル状にusersテーブルのデータが表示されるので任意のレコードのチェックボックスにチェックをいれて「保存」をクリックする。
    
        ![127_0_0_1_8001_input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ae96c72f-c559-61ff-61d1-3107a8a52b85.png)

    1. outputの画面に移動する。
    1. 再度下記にアクセスする。
        - [http://127.0.0.1:8000/input](http://127.0.0.1:8000/input)
    1. 先程チェックを入れて保存したカラムのチェックボックスはデフォルトでチェックが入った状態になっている。

        ![127_0_0_1_8001_input-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/daf49fb0-bac1-d126-5f1e-f23521f6e240.png)