LaravelでCRUD機能を実装する

# この記事で行うこと
Laravelを使って、基本的なCRUD機能を作成する。(index, store, update, destroy)

# 開発環境
- MacBook Air M1
- PHP v8.2.7
- Laravel v10.13.5

# まずはじめに
今回使用するモデル
- **Diaryモデル**
    - title
    - content
    - created_at
    - updated_at 

アプリケーション作成時に基本となるアクション、ルーティング設定を確認する。

|機能 |アクション名 |
|:-:|:-:|
|一覧表示|index|
|新規作成   |create, store|
|レコード表示   | show|
|更新処理   | edit, update |
|削除機能   | destroy  |

続いて、各アクションに対するルーティングを確認する。
| ルーティング | アクション |
|:-:|:-:|
| /コントローラ  | index  |
| /コントローラ  | store(POST送信)  |
| /コントローラ/ID  | show  |
| /コントローラ/ID  | update(PUT/PSTCH送信)  |
| /コントローラ/ID  | delete(DELETE送信)  |

**今回は、フォームを表示するためのアクションは除外しています。**

これらのアクションは`php artisan`コマンドを使用することで一括作成できる
```
php artisan make:controller コントローラ名 --resource
```

# 各アクションの作成
それでは、各アクションの処理を実装していきます。

### indexアクション
```DiaryController.php
public function index()
	{ 
		$items = Diary::all();
		return view('diary.index', ['items' => $items]);
	}
```
※Viewは一部抜粋
```resources/views/diary/index.blade.php
@foreach ($items as $item)
  <div>
    <div>
      <a href="{{ route('diary.edit', ['id'=>$item->id]) }}">
        <h3>{{$item->title}}</h3>
      </a>
      <p>{{$item->content}}</p>
    </div>
  </div>
@endforeach
```
```routes/web.php
Route::get('diary', [DiaryController::class, 'index'])->name('diary.index');
```

### storeアクション
```DiaryController.php
public function store(Request $request)
{
	$this->validate($request, Diary::$rules);
	$diary = new Diary;
	$form = $request->all();
	unset($form['_token']);
	$diary->fill($form)->save();
	return redirect()->route('diary.index');
}
```
※Viewは一部抜粋
```resources/views/diary/create.blade.php
<form method="POST" action="{{ route('diary.store') }}">
      @csrf
      <div>
        <label for="title">タイトル</label>
        <input name="title" />
      </div>

      <div>
        <label for="content">本文</label>
        <textarea name="content" ></textarea>
      </div>

      <div>
        <button>投稿</button>
      </div>
    </form>
```
```routes/web.php
Route::post('diary', [DiaryController::class, 'store'])->name('diary.store');
```

### updateアクション
```DiaryController.php
// 日記更新処理
	public function update(Request $request)
	{
		$this->validate($request, Diary::$rules);
		$diary = Diary::find($request->id);
		$form = $request->all();
		unset($form['_token']);
		$diary->fill($form)->save();
		return redirect()->route('diary.index');
	}
```
※Viewは一部抜粋
```resources/views/diary/edit.blade.php
<form method="POST" action="/diary/{{$form->id}}">
  @csrf
  @method('PUT')
  <div>
    <label for="title">タイトル</label>
    <input name="title" value="{{$form->title}}" />
  </div>

  <div>
    <label for="content">本文</label>
    <textarea name="content">{{$form->content}}</textarea>
  </div>

  <div>
    <button>更新</button>
  </div>
</form>
```
```routes/web.php
Route::put('diary/{id}', [DiaryController::class, 'update'])->name('diary.update');
```

### destroyアクション
```DiaryController.php
// 日記削除処理
	public function destroy(Request $request)
	{
		Diary::find($request->id)->delete();
		return redirect()->route('diary.index');
	}
```
※Viewは一部抜粋
```resources/views/diary/index.blade.php
<form action="{{ route('diary.destroy', ['id'=>$item->id]) }}" method="POST">
  @csrf
  @method('DELETE')
  <button>削除</button>
</form>
```
```routes/web.php
Route::delete('diary/{id}', [DiaryController::class, 'destroy'])->name('diary.destroy');
```