Laravel レコード削除機能の設置

Laravel

この記事のゴール

  • Laravelで作成したWEBサイト上から指定したレコードを削除する。

前提条件

  • レコード挿入、検索、更新まではできている。

 ※まだの場合は、前回の記事を参考にしてください。

これからやる作業

  • コントローラー編集
  • ルーティング
  • Bladeテンプレート編集

コントローラー編集

[app/Http/Controllers/TodoController.php] を次のように編集します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Todo;

class TodoController extends Controller
{
    public function index()
    {
        return view('todo.index', [
            'pageTitle' => 'TODOリスト',
            'todos' => Todo::all(),
        ]);
    }

    public function retrieve($id)
    {
        return view('todo.detail', [
            'pageTitle' => 'TODO詳細',
            'todo' => Todo::find($id),
        ]);
    }

    public function create()
    {
        return view('todo.create', [
            'pageTitle' => 'TODO新規登録',
        ]);
    }

    public function store(Request $request)
    {
        $this->validate($request, Todo::$rules);
        $todo = new Todo();
        $todo->fill($request->except('_token'))->save();
        return redirect(route('todo.index'));
    }

    public function edit($id)
    {
        return view('todo.edit', [
            'pageTitle' => 'TODO編集',
            'todo' => Todo::find($id),
        ]);
    }

    public function update(Request $request, $id)
    {
        $this->validate($request, Todo::$rules);
        $todo = Todo::findOrFail($id);
        $todo->fill($request->except('_token', '_method'))->save();
        return redirect(route('todo.detail', ['id' => $id]));
    }

    public function destroy($id)
    {
        $todo = Todo::findOrFail($id);
        $todo->delete();
        return redirect(route('todo.index'));
    }
}

57行目~62行目を追記しています。

ルーティング

[routes/web.php] に次の行を追記して保存します。

    Route::delete('/destroy/{id}', [TodoController::class, 'destroy'])->whereNumber('id')->name('destroy');

Bladeテンプレート編集

詳細ページに削除のリンクを設置します。

[resouces/views/todo/detail.blade.php] を次のように編集して保存します。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{{$pageTitle}}</title>
    </head>
    <body>
        <h1>{{$pageTitle}}</h1>
        @isset($todo)
        <p>
            <a href="{{route('todo.edit', ['id' => $todo->id])}}">[編集]</a> 
            <form method="POST" action="{{route('todo.destroy', ['id' => $todo->id])}}"
                onClick="event.preventDefault();this.closest('form').submit()"
            >
                @csrf
                @method('delete')
                <a href="">[削除]</a>
            </form>
            やること: {{$todo->todo}}<br />
            状態:{{$todo->done ? '完了' : '未完'}}
        </p>
        @else
        <p>情報がありません。</p>
        @endisset
        <a href="{{route('todo.index')}}">todo一覧</a>
    </body>
</html>

12行目~18行目に削除のリンクを追記しています。

ブラウザで確認

ブラウザのアドレスバーに http://localhost/todo/1 を入力してアクセスします。

削除のリンクをクリックします。

一覧ページへリダイレクトして、1件目の「【済】Aプロジェクト巻取改修」が

削除されていることが確認できます。

今回はこれで完了です。

次回は自動テストを予定しています。

お疲れさまでした。

コメント

タイトルとURLをコピーしました