【Laravel入門】CRUD実装〜削除

最後はCRUDのDelete（削除）だ。投稿された記事を削除できるようにする。

# コントローラ追記

```ArticleController.php
public function delete(Request $request)
{
    $article = Article::find($request->id);
    return view('article.delete', ['article' => $article]); 
}

public function remove(Request $request)
{
    $article = Article::find($request->id);
    $article->delete();
    return redirect('/');
}
```

今回実装する機能はCRUDの``Delete（削除）``つまり``articleの削除機能``だ。ダイレクトに削除しても良いのだが、まず削除したい記事を表示してから削除ボタンを押せるようにしたい。そのため、今回も``delete``と``remove``の２つのアクションに分けた。これを説明していく。

## deleteアクション

editアクションの記述と全く同じだ。idを基準に削除したいarticleを指定し、表示させている。

- deleteアクションは``articleの削除前に確認用画面を表示``させる。
- 確認用画面には、``削除対象であるarticleの内容が表示される``ようにしたい。そのためのデータを得るアクションなので、``HTTPメソッド``は``GET``となる。
- ``Requestクラス``により作成された``HTTPリクエストインスタンス``が``$request``に代入される。
- $requestには``GETで受け取った情報（ユーザーが削除したい記事のidプロパティ）``が入っている。
- ``Articleクラス``の``findメソッド``で、``指定されたid（$requestのidプロパティ）に該当するレコードを取得``し、$articleへ代入する。
- 確認用画面``'article.delete'ビュー``で``'article'をキー``としてデータが使用できるように、$articleを渡す。

## removeアクション

- removeアクションは、``articleの内容を確認後、削除ボタンをクリックしその内容を送信した後``に``articlesテーブルに格納されたデータを削除する``ために行われる。そのため``HTTPメソッド``は``POST``となる。
- 引数に``Request $request``を指定しているので、``HTTPリクエストインスタンス``が``$request``に代入される。
- ``$request``には``POSTで受け取った情報（ユーザーが削除したい記事のidプロパティ）``が入っている。
- ``findメソッド``で``指定されたid（$requestのidプロパティ）に該当するレコードを取得``し、$articleへ代入する。
- モデルの``deleteメソッド``を実行し、データベースから該当レコードを削除する。
- 上記の作業が終わったら、``'/（トップページ）'ビュー``へリダイレクトする。

removeアクションは、``->（アロー演算子）``でメソッドをつなぐ書き方もできる。

```ArticleController.php
$article = Article::find($request->id)->delete();
return redirect('/');
```

# ルーティング設定

HTTPメソッドの違いでアクションを振り分けている。

```web.php
Route::get('/article/delete', 'ArticleController@delete')->name('article_delete');
Route::post('/article/remove', 'ArticleController@remove')->name('article_remove');
```
# ビュー表示

``resources/views/articleディレクトリ``に``delete.blade.php``を作成し、編集する。


今回``removeアクションへPOST``しているのは、``articleのidだけ``だ。編集作業ではないのでid以外の情報をやり取りする必要はないし、もちろん編集用のフォームも存在しない。確認用画面では、単純にメソッドから引き出した各プロパティが表示されているだけだ。

idプロパティについては``type属性をhiddenに指定``してあるためビューには表示されていないが、削除ボタンをクリックした後に行われるremoveアクションで、idプロパティの値を基準に削除対象のデータを探すために使用されている。

```resources/views/article/delete.blade.php
@extends('...layouts.layout')

@section('article_delete')
    投稿削除<br>

    <form action='{{ route('article_remove') }}' method='post'>
        {{ csrf_field() }}
            <input type='hidden' name='id' value='{{ $article->id }}'><br>
            ユーザーID：{{ $article->user_id }}<br>
            タイトル：{{ $article->title }}<br>
            内容：{{ $article->content }}<br>
            <input type='submit' value='削除'>
    </form>
@endsection
```

こちらの記述も忘れずに。

```resources/views/layouts/layout.blade.php
@yield('article_delete')
```

それぞれの記事へのアクセスは、前回の記事を参考にして欲しい。

[【Laravel入門】CRUD実装〜編集〜どこでidを指定するのか](https://qiita.com/33yuki/items/da6b49ed05e04e21017f#どこでidを指定するのか)

今回は、下記内容を``index.blade.php``に記述すれば良い。

```resources/views/article/index.blade.php
<a href="{{ route('article_delete') }}?id={{ $article->id }}">削除</a>
```

これでCRUD実装が一通り終わった。showアクションについては・・・忘れていた。

プログラミングの上達にはコードを書くのが一番だが、こうやって記事にしてみると自分の理解の浅さが露呈する。自分の立ち位置やレベルを確認するためにも、拙い記事であってもエンジニアの皆様の目に晒されるのは良い経験になる。

今回はここまで。