Laravel 最終ログイン日時をDBに格納する

# 目的

- Authを用いたログイン機能で、最終ログイン時間をDBに保存する方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| 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を用いて導入 |

# 前提情報

- 下記の方法、またはそれに準ずる方法でLaravelアプリにAuthを用いたログイン機能が実装されていること。
    - [Mac Laravel 7 Authを用いたユーザ登録 ログイン ログアウトなどの機能を作成する](https://qiita.com/miriwo/items/5d4a94e8d2aa06b61530)
- Authがユーザ情報を格納するusersテーブルに最終ログイン時間の格納を行う。

# 実施概要

1. カラムの追加
1. ログイン日時格納設定
1. 確認

# 実施詳細

1. カラムの追加
    1. アプリ名ディレクトリで下記コマンドを実行して最終ログイン日時のカラムを追加するためのマイグレーションファイルを作成する。

        ```terminal
        $ php artisan make:migration add_last_login_at_column_to_users_table --table=users
        ```
    1. アプリ名ディレクトリで下記コマンドを実行してマイグレーションファイルを開く(マイグレーションファイル名は先のコマンド実行日時により変化するので都度修正して実行する。)

        ```terminal
        $ vi database/migrations/YYYY_MM_DD_XXXXXX_add_last_login_at_column_to_users_table.php
        ```
    1. 先のコマンドで開いたマイグレーションファイルを下記のように修正する。

        ```アプリ名ディレクトリ/database/migrations/YYYY_MM_DD_XXXXXX_add_last_login_at_column_to_users_table.php
        <?php
        
        use Illuminate\Database\Migrations\Migration;
        use Illuminate\Database\Schema\Blueprint;
        use Illuminate\Support\Facades\Schema;
        
        class AddLastLoginAtColumnToUsersTable extends Migration
        {
            /**
             * Run the migrations.
             *
             * @return void
             */
            public function up()
            {
                Schema::table('users', function (Blueprint $table) {
                    //下記を追記する、nullの格納を許容した、dateTime型のlast_logim_atカラム
                    $table->dateTime('last_login_at')->nullable();
                });
            }
        
            /**
             * Reverse the migrations.
             *
             * @return void
             */
            public function down()
            {
                Schema::table('admins', function (Blueprint $table) {
                    //
                });
            }
        }
        ```
    1. アプリ名ディレクトリで下記を実行してマイグレートを行う。

        ```terminal
        $ php artisan migrate
        ```
1. ログイン日時格納設定
    1. アプリ名ディレクトリで下記コマンドを実行してログイン時に実行されるファイルを開く。

        ```terminal
        $ vi code app/Http/Controllers/Auth/LoginController.php
        ```
    1. `class LoginController extends Controller`の中括弧(`{}`)内の最終行に下記の4行を記載する。

        ```アプリ名ディレクトリ/app/Http/Controllers/Auth/LoginController.php
        protected function authenticated(Request $request, $time)
        {
            $time->last_login_at = now();
            $time->save();
        }
        ```
    1. 追記が完了した「LoginController.php」ファイルの内容を記載する。

        ```アプリ名ディレクトリ/app/Http/Controllers/Auth/LoginController.php
        <?php
        
        namespace App\Http\Controllers\Auth;
        
        use App\Http\Controllers\Controller;
        use App\Providers\RouteServiceProvider;
        use Illuminate\Http\Request;
        use Illuminate\Foundation\Auth\AuthenticatesUsers;
        
        class LoginController extends Controller
        {
            /*
            |--------------------------------------------------------------------------
            | Login Controller
            |--------------------------------------------------------------------------
            |
            | This controller handles authenticating users for the application and
            | redirecting them to your home screen. The controller uses a trait
            | to conveniently provide its functionality to your applications.
            |
            */
        
            use AuthenticatesUsers;
        
            /**
             * Where to redirect users after login.
             *
             * @var string
             */
            protected $redirectTo = '/user_home';
        
            /**
             * Create a new controller instance.
             *
             * @return void
             */
            public function __construct()
            {
                $this->middleware('guest')->except('logout');
            }
        
            protected function authenticated(Request $request, $time)
            {
                $time->last_login_at = now();
                $time->save();
            }
        }
        ```
    1. 実際にLaravelアプリ上でログインを行う 
1. 確認
    1. 下記コマンドを実行してMySQLにターミナルからログインする。(MySQLのrootパスワードを忘れた方はこちら→[MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d))

        ```terminal
        $ mysql -u root -p
        ```
    1. 下記を実行してLaravelアプリで使用しているデータベースを指定する。

        ```mysql
        mysql> use データベース名;
        ```
    1. 下記コマンドを実行してlast_login_atカラムにログイン時間が格納されている事を確認する。

        ```mysql
        mysql> select * from users;
        ```
    1. ログイン時間が格納されていれば実装完了である。(日本時間ではない日時が格納されてしまった方はこちら→[Laravel タイムゾーンを日本に変更する](https://qiita.com/miriwo/items/16a982a36e7a62c4c86a))