[Laravel] CRUD 一覧画面

## 概要

よくあるCRUDの個人メモ。
一覧画面を表示するまでの過程をまとめる。

## 環境

* MacOS
* Laravel 6.18.40
* MySQL(docker)
    * DB名: tasklist

## 前提条件

以下の事前準備が完了していること。

https://qiita.com/Hiroto10/items/614a0eed576c528f480b

## マイグレーション

テーブル名を`tasks`とし、マイグレーションファイルを作成する。
以下コマンドにより、`YYYY_MM_DD_*_create_tasklist_table.php`が作成される。

```sh
$ php artisan make:migration create_tasklist_table --create=tasks
Created Migration: 2020_09_29_130736_create_tasklist_table
```

作成されたマイグレーションファイルにテーブル定義を行う。
今回は、`task`カラムを追加する。

```database/migrations/2020_09_29_130736_create_tasklist_table.php
        Schema::create('tasks', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('task');
            $table->timestamps();
        });
```

カラムの定義後、マイグレーションを実行する。

```sh
$ php artisan migrate

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.23 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.22 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.08 seconds)
Migrating: 2020_09_26_173743_create_tasklist_table
Migrated:  2020_09_26_173743_create_tasklist_table (0.07 seconds)
```

`tasks`テーブルが作成されていることを確認する。

```
mysql> show tables;
+--------------------+
| Tables_in_tasklist |
+--------------------+
| failed_jobs        |
| migrations         |
| password_resets    |
| tasks              |
| users              |
+--------------------+
5 rows in set (0.00 sec)
```

## モデル

`Task`モデルの作成を行う。
出力先は`app/`配下。

```sh
$ php artisan make:model Task
Model created successfully.
```

## Routing

`routes/web.php`にルーティングの定義を行う。デフォルトで記載されている定義は削除して問題ない。
今回はRESTfulにルーティングさせる。

```routers/web.php
Route::get('/', 'TasksController@index');
Route::resource('tasks', 'TasksController');
```

## Controllerの作成

Controllerの作成を以下コマンドで行う。

```
$ php artisan make:controller TasksController --resource
Controller created successfully.
```

Controller作成後、RESTfulなルーティング定義となっていることを確認してみる。

```
$ php artisan route:list                                                               
+--------+-----------+-------------------+---------------+----------------------------------------------+--------------+
| Domain | Method    | URI               | Name          | Action                                       | Middleware   |
+--------+-----------+-------------------+---------------+----------------------------------------------+--------------+
|        | GET|HEAD  | /                 |               | App\Http\Controllers\TasksController@index   | web          |
|        | GET|HEAD  | api/user          |               | Closure                                      | api,auth:api |
|        | GET|HEAD  | tasks             | tasks.index   | App\Http\Controllers\TasksController@index   | web          |
|        | POST      | tasks             | tasks.store   | App\Http\Controllers\TasksController@store   | web          |
|        | GET|HEAD  | tasks/create      | tasks.create  | App\Http\Controllers\TasksController@create  | web          |
|        | GET|HEAD  | tasks/{task}      | tasks.show    | App\Http\Controllers\TasksController@show    | web          |
|        | PUT|PATCH | tasks/{task}      | tasks.update  | App\Http\Controllers\TasksController@update  | web          |
|        | DELETE    | tasks/{task}      | tasks.destroy | App\Http\Controllers\TasksController@destroy | web          |
|        | GET|HEAD  | tasks/{task}/edit | tasks.edit    | App\Http\Controllers\TasksController@edit    | web          |
+--------+-----------+-------------------+---------------+----------------------------------------------+--------------+
```

本投稿では一覧画面を表示させることが目的のため、Controllerの`index`メソッドの編集とモデルの定義のみを行う。
テーブルに格納された値を全て取得し、viewの tasks.index に値を渡す処理。

```App/Http/Controllers/Tasks/Controller.php
//使用するモデルを定義
use App\Task;

    public function index()
    {
        $tasks = Task::all();

        return view('tasks.index', [
            'tasks' => $tasks,
        ]);
    }
```

## viewの作成

`tasks/index.blead.php`を作成後、ファイルを編集する。
データが1件以上ある場合、id と task カラムの値を出力させる。 

```resources/views/tasks/index.blead.php
<body style="background-color: #FFFFEE;" >
  <div>
    @if (count($tasks) > 0)
      @foreach ($tasks as $task)
        {{ $task->id }}
        {{ $task->task }}
      @endforeach
    @endif
  </div>
</body>
```

現在テーブルに1件もデータがないため、適当な値を追加しておく。

```
mysql> INSERT INTO tasks (task) VALUES ('Hello World!');
```

## 内部サーバの起動

デフォルトで付属しているサーバを起動させ、動作を確認する。

```
$ php artisan serve --host=127.0.0.1 --port=8080
Laravel development server started: http://127.0.0.1:8080
```

ブラウザから`http://127.0.0.1:8080`へアクセスすると、データが表示されている。

![スクリーンショット 2020-09-29 22.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/7c00f125-87ee-2a0c-e508-586fc16ddf3d.png)

### 画面の体裁

上記の表示では一覧画面とは言えないため、簡単に体裁を整える。

```resources/views/layouts/app.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css">
  <title>Task List</title>
</head>
<body>
  <div class="container">
    @yield('content')
  </div>

  <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js"></script>
  <script defer src="https://use.fontawesome.com/releases/v5.7.2/js/all.js"></script>
</body>
</html>
```

```tasks/index.blade.php
@extends('layouts.app')
@section('content')
  @if (count($tasks) > 0)
    <table class="table table-striped">
      <thead>
        <tr>
          <th>id</th>
          <th>タスク</th>
        </tr>
      </thead>
      <tbody>
        @foreach ($tasks as $task)
        <tr>
          <td>{{ $task->id }}</td>
          <td>{{ $task->task }}</td>
        </tr>
        @endforeach
      </tbody>
    </table>
  @endif
@endsection
```

![スクリーンショット 2020-09-29 23.00.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/d28f34cd-57df-58e0-56c7-bcfcb4d9d14a.png)

以上

---