laravel
delete
crud

【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の削除機能だ。ダイレクトに削除しても良いのだが、まず削除したい記事を表示してから削除ボタンを押せるようにしたい。そのため、今回もdeleteremoveの2つのアクションに分けた。これを説明していく。

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を指定するのか

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

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

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

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

今回はここまで。