LaravelのEloquentを利用してレコード取得・レコード登録まで行いました。 今回はEloquentを利用してレコード削除を実装していきます。簡単なフォームを利用して削除したいレコードを選択し、削除できるようにしてみましょう。

LaravelのEloquentでレコード削除

3年以上前に更新されました。情報が古い可能性があります。
更新日 : 2020年02月05日

LaravelのEloquentを利用してレコード取得レコード登録まで行いました。

今回はEloquentを利用してレコード削除を実装していきます。簡単なフォームを利用して削除したいレコードを選択し、削除できるようにしてみましょう。

事前準備

レコード取得とレコード登録で利用したpostsテーブル・Postモデル・PostControllerをそのまま利用するので、事前に前2つの記事内容の実装をしておきましょう。

削除選択のフォーム作成

今回は選択した記事を削除できるように記事リストを表示して選択削除できるようにしましょう。

まずは記事リスト用のURLを作成するためにweb.phpを編集します。前回の記事で作成したグループ化したルーティングを利用して追記します。

Route::prefix('post')->group(function () {
    // フォーム表示用
    Route::get('add', 'PostController@addForm');
    // POSTデータを受け取る用
    Route::post('add', 'PostController@add');
    // 記事リストを表示するフォーム
    Route::get('list', 'PostController@list');
});

Route::get('list', 'PostController@list');が追記した部分です。これでhttp://localhost:8888/Laravelのドキュメントルート/post/listで記事リストを表示するURLの完成です。

PostController@listとなっているので、PostControllerlistメソッドを作成してみましょう。

public function list() {
    $posts = Post::all();
    return view('post.list', ['posts' => $posts]);
}

このような形でメソッドを追加しました。記事の全リストを取得してresources/views/post/list.blade.phpにデータを渡してます。次にこのビューファイルを作成しましょう。

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>記事リスト</title>

    <!-- Fonts -->
    <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">

    <!-- Styles -->
    <style>
        html, body {
            background-color: #fff;
            color: #636b6f;
            font-family: 'Nunito', sans-serif;
            font-weight: 200;
            height: 100vh;
            margin: 0;
        }

        .flex-center {
            align-items: center;
            margin: 100px 300px 100px 300px;
            justify-content: center;
        }

        .position-ref {
            position: relative;
        }
    </style>
</head>
<body>
    <div class="flex-center position-ref">
        <h1>ブログ記事リスト</h1>
        <form method="POST" action="delete">
            @csrf
            <table border="1" cellspacing="0" cellpadding="5" align="left">
                <thead>
                    <tr>
                        <th>選択</th><th>id</th><th>タイトル</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach ($posts as $post)
                        <tr>
                            <td><input type="checkbox" name="ids[]" value="{{ $post->id }}"></td>
                            <td>{{ $post->id }}</td>
                            <td>{{ $post->title }}</td>
                        </tr>
                    @endforeach
                </tbody>
            </table>
            <br>
            <input type="submit" value="選択した記事を削除">
        </form>
    </div>
</body>
</html>

このような形で記事リストと削除フォームを同時に定義しました。チェックボックスにチェックを入れてボタンを押すと、選択された記事idがdeleteへ送信されます。

送信先のdeleteのページを作成して削除機能を実装してみましょう。

POSTデータを受け取り、受け取った記事idで記事を削除

削除処理を実行するdeleteを作成しましょう。web.phpに以下を追記します。

Route::prefix('post')->group(function () {
    // フォーム表示用
    Route::get('add', 'PostController@addForm');
    // POSTデータを受け取る用
    Route::post('add', 'PostController@add');
    // 記事リストを表示するフォーム
    Route::get('list', 'PostController@list');
    // 選択された記事を削除する処理
    Route::post('delete', 'PostController@delete');
});

最後にRoute::post('delete', 'PostController@delete');を追記しました。これでhttp://localhost:8888/Laravelのドキュメントルート/post/deleteにPOSTされた記事idリストの記事データが削除されることになります。

コントローラーの方にもdeleteメソッドを追加していきましょう。

public function delete(Request $request) {
    // バリデーション
    $validatedData = $request->validate([
        'ids' => 'array|required'
    ]);

    Post::destroy($request->ids);
    return redirect('post/list');
}

バリデーションを一応行っています。実際に削除処理を行っているのはPost::destroy($request->ids);です。Eloquentモデルにあるdestroyメソッドを呼び出しています。

destroyメソッドの引数には主キーを入れます。このdestroyメソッドの引数は、主キーを1つだけ入れても、主キーの配列やコレクションでもOKです。引数に入れた主キーに対応するレコードが削除されます。

最後にreturn redirect('post/list');としています。
redirectを利用することで引数に入れたURLにリダイレクトしてくれます。そのため、これで削除後に記事リストのページへ自動的に移動します。

これで記事リストからチェックボックスで選択して、削除ボタンをクリックすると記事が削除され、再度記事リストにリダイレクトされます。

リダイレクト後は、選択した記事が削除されているため、記事リストには表示されなくなります。一応表示結果は以下のようになります。

削除後は以下のように表示されるはずです。

まとめ

今回はレコード一覧(記事一覧)の表示と、選択されたレコードの削除を行いました。

これでデータベースのCRUDのうち、Updateを除く全ての処理を行いました。Updateに関しては改めて記事にしますが、レコード登録で利用したsaveメソッドを利用するので、難しくはないかと思います。