Laravel Eloquantを用いてデータを取り出す

# 目的

- Eloquantを用いたデータのやりとりの方法を学んだので忘れないようにまとめる

# 実施環境

- ハードウェア環境

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

# 前提条件

- 先に記載した実施環境にて下記のtodosテーブルがすでに存在している事とする。
    - todosテーブルのカラム設定

        | Field      | Type            | Null | Key | Default | Extra          |
        |---|---|---|---|---|---|
        | id         | bigint unsigned | NO   | PRI | NULL    | auto_increment |
        | user_id    | int             | NO   |     | NULL    |                |
        | content    | varchar(255)    | NO   |     | NULL    |                |
        | memo       | varchar(255)    | NO   |     | NULL    |                |
        | priority   | int             | NO   |     | 1       |                |
        | created_at | timestamp       | YES  |     | NULL    |                |
        | updated_at | timestamp       | YES  |     | NULL    |                |
    - 先のtodosテーブルを作成した際のマイグレーションファイルの内容を下記に記載する。

        ```アプリ名ディレクトリ/database/migrations/2020_03_27_163741_create_todos_table.php
        <?php
  
        use Illuminate\Database\Migrations\Migration;
        use Illuminate\Database\Schema\Blueprint;
        use Illuminate\Support\Facades\Schema;

        class CreateTodosTable extends Migration
        {
            /**
             * Run the migrations.
             *
             * @return void
             */
            public function up()
            {
                Schema::create('todos', function (Blueprint $table) {
                    $table->id();
                    $table->integer('user_id');
                    $table->string('content');
                    $table->string('memo');
                    $table->integer('priority')->default(1);
                    $table->timestamps();
                });
            }

            /**
             * Reverse the migrations.
             *
             * @return void
        ```
    - 先のtodosテーブルに下記のデータが格納されている物とする。

        | id | user_id | content | memo  | priority | created_at          | updated_at          |
        |---|---|---|---|---|---|---|
        |  1 |       1 | test    | test  |        1 | 2020-04-13 08:01:02 | 2020-04-13 08:01:02 |
        |  2 |       1 | test2   | test2 |        0 | 2020-04-13 09:15:15 | 2020-04-13 09:15:15 |
        |  3 |       1 | test3   | test3 |        2 | 2020-04-13 09:18:12 | 2020-04-13 09:18:12 |

# 事前知識

- このアプリにはAuthを用いたログイン機能を実装してある。
    - 実装してみたい人はこちら→[Mac Laravel 7 Authを用いたユーザ登録 ログイン ログアウトなどの機能を作成する](https://qiita.com/miriwo/items/5d4a94e8d2aa06b61530)
- URL`ローカルサーバのIP/user_home`にアクセスした際に、ログイン中のuser_idのテーブル内の「id」「content」「memo」を表で表示する。
- ルーティングは`アプリ名ディレクトリ/routes/web.php`に記載する。
- コントローラのアクションは`アプリ名ディレクトリ/app/Http/Controllers/UserHomeController.php`に記載する。
- ビューは`アプリ名ディレクトリ/resources/views/home/user_home.blade.php`に記載する。

# 実施方法概要

1. モデルの作成(未実施の場合のみ)
1. テーブルの紐付け
1. データの抽出
1. ルーティングの準備
1. コントローラの準備
1. ビューの準備
1. 確認

# 実施方法詳細

1. モデルの作成(未実施の場合のみ)
    1. アプリ名ディレクトリで下記コマンドを実行する。

        ```terminal
        $ php artisan make:model Todo
        ```
    1. アプリ名ディレクトリ/app直下にTodo.phpファイルが作成されている事を確認する。
1. テーブルの紐付け

    1. アプリ名ディレクトリで下記コマンドを実行してモデルファイルを開く。

        ```terminal
        $ vi app/Todo.php
        ```
    1. 下記のように記載されている事を確認する。

        ```アプリ名ディレクトリ/app/Todo.php
        <?php

        namespace App;

        use Illuminate\Database\Eloquent\Model;

        class Todo extends Model
        {
            //
        }
        ```
     1. 下記のように修正してtodosテーブルを紐づける。

        ```アプリ名ディレクトリ/app/Todo.php
        <?php

        namespace App;

        use Illuminate\Database\Eloquent\Model;

        class Todo extends Model
        {
            protected $table = 'todos';
        }
        ```
1. ルーティングの準備
    1. アプリ名ディレクトリで下記コマンドを実行してルーティングファイルを開く。

        ```terminal
        $ vi routes/web.php
        ```
    1. 開いたルーティングファイルに下記の内容を記載する。
    
        ```アプリ名ディレクトリ/routes/web.php
        Route::get('/user_home', 'UserHomeController@user_home');
        ```
1. コントローラの準備
    1. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを作成する。

        ```terminal
        $ php artisan make:controller UserHomeController
        ```
    1. `アプリ名ディレクトリ/app/Http/Controllers`直下にUserHomeController.phpファイルが作成されている事を確認する。
    1. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを開く。

        ```terminal
        $ vi app/Http/Controllers/UserHomeController.php
        ```
    1. 開いたコントローラファイルを下記のように修正する。

        ```アプリ名ディレクトリ/app/Http/Controllers/UserHomeController.php
        <?php

        namespace App\Http\Controllers;

        //先に作成したモデルの継承
        use App\Todo;
        //作成時から記載されていた継承
        use Illuminate\Http\Request;
        //Authを使ったログイン情報を得るための継承
        use Illuminate\Support\Facades\Auth;

        class UserHomeController extends Controller
        {
            //user_homeアクションを引数無しで定義する
            public function user_home() {
                //変数itemsにEloquantの機能を用いてtodosテーブルの全てのデータを格納する
                $items = Todo::all();
                //変数user_itemsに先に取得した変数itemsを変数userに格納した値でフィルターした値を格納する(フィルターの内容は次の行に記載)
                $user_items = $items->filter(function($user) {
                    //$変数userにusers_idがAuth::id()のフィルター内容を格納する。(Auth::id()は現在ログイン中のuser_idを取得している)
                    return $user->users_id === Auth::id();
                });
                //アプリ名ディレクトリ/resource/view/homeディレクトリにあるuser_home.blade.phpファイルを表示する。表示する際に、本アクションで定義した$user_items変数をitems変数としてビューファイルに渡す。
                return view('home.user_home', ['items' => $user_items]);
            }
        }
        ```
1. ビューの準備
    1. アプリ名ディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。 

        ```terminal
        $ mkdir resources/views/home
        ```
    1. アプリ名ディレクトリで下記コマンドを実行してビューファイルを作成する。

        ```terminal
        $ vi resources/views/home/user_home.blade.php
        ```
    1. 開いたビューファイルに下記の内容を記載する。

        ```アプリ名ディレクトリ/resources/views/home/user_home.blade.php
        <table>
            <tr>
                <th>id</th>
                <th>やること</th>
                <th>memo</th>
            </tr>
            <!-- コントローラから渡された変数itemsの内容を変数itemに格納してforeachの処理を実行する -->
            @foreach ($items as $item)
                <tr>
                    <td>{{$item->id}}</td>
                    <td>{{$item->content}}</td>
                    <td>{{$item->memo}}</td>
                </tr>
            @endforeach
        </table>
        ```
1. 確認
    1. ローカルサーバを起動して下記にアクセスする。
        -[http://127.0.0.1:8000/user_home](http://127.0.0.1:8000/user_home)
    1. 下記のように表示される事を確認する。

        <img width="353" alt="スクリーンショット 2020-04-14 13.16.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a9b665b5-b39a-8a72-791e-1d0e0216c4cc.png">