Laravelでカンタンなアプリを作ってMVCモデルを理解する➂

タスクを削除できるようにする

タスクを完全に削除せず、ソフトデリート(論理削除)を行うようにする。

ソフトデリートを導入するメリット
データの復元ができる(「間違えて削除した!」→ 復元できる)
削除履歴を残せる(いつ誰が削除したか管理できる)
実際にデータを削除しないので、関連データを保持できる

ルーティングを追加

routes/web.phpDELETE のルートを追加。

Route::delete('/tasks/{id}', [TaskController::class, 'destroy']);

/tasks/{id}DELETE リクエストを送ると destroy() が実行すできるようになります。

テーブル構造を変更する

現在のテーブル構造は

カラム名データ型説明
idbigint (AUTO_INCREMENT)主キー(自動で増加)
titlestring (VARCHAR)タスクの名前
completedboolean (TINYINT)タスクの完了フラグ (true=完了, false=未完了)
created_attimestamp作成日時(自動で設定)
updated_attimestamp更新日時(自動で設定)

このようになっている。
ここに、削除フラグのカラムを追加するため、マイグレーションを変更します。

新しいマイグレーションを作成

php artisan make:migration add_deleted_at_to_tasks_table --table=tasks

作成されたマイグレーションファイル (database/migrations/YYYY_MM_DD_add_deleted_at_to_tasks_table.php) を編集。

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up()
    {
        Schema::table('tasks', function (Blueprint $table) {
            $table->softDeletes(); // 削除フラグ(deleted_at カラムを追加)
        });
    }

    public function down()
    {
        Schema::table('tasks', function (Blueprint $table) {
            $table->dropSoftDeletes(); // 削除フラグを削除
        });
    }
};

マイグレーションを実行

php artisan migrate

これで tasks テーブルに deleted_at カラムが追加される。
実際に追加されているのか確認をしてみよう。

モデルにSoftDeletesを追加する

app/Models/Task.php を開いて、以下を追加。

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; //  追加

class Task extends Model
{
    use HasFactory, SoftDeletes; //  SoftDeletes を追加

    protected $fillable = ['title', 'completed'];
    protected $dates = ['deleted_at']; //  削除日時を日付型で管理
}

SoftDeletes を追加すると、delete() を実行してもデータは削除されず deleted_at に値が入る!

削除ボタンの処理を追加する

app/Http/Controllers/TaskController.phpdestroy() メソッドを追記します。

public function destroy($id)
{
    $task = Task::findOrFail($id); // 指定したIDのタスクを取得
    $task->delete(); // ソフトデリート(deleted_at に値が入る)

    return redirect('/tasks')->with('success', 'タスクを削除しました!');
}

れで /tasks/{id}DELETE メソッドでリクエストを送ると、そのタスクが削除(ソフトデリート)される!

削除ボタンをフォームに追記する

resources/views/tasks/index.blade.php を編集し、削除ボタンを追加。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>タスク一覧</title>
</head>
<body>
    <h1>タスク一覧</h1>

    <!-- 成功メッセージ表示 -->
    @if (session('success'))
        <p style="color: green;">{{ session('success') }}</p>
    @endif

    <!-- タスク追加フォーム -->
    <form action="/tasks" method="POST">
        @csrf
        <input type="text" name="title" placeholder="タスクを入力">
        <button type="submit">追加</button>
    </form>

    <ul>
        @foreach ($tasks as $task)
            <li>
                {{ $task->title }} - {{ $task->completed ? '✅ 完了' : '❌ 未完了' }}
                <!-- 削除ボタン -->
                <form action="/tasks/{{ $task->id }}" method="POST" style="display:inline;">
                    @csrf
                    @method('DELETE')
                    <button type="submit" onclick="return confirm('このタスクを削除しますか?')">🗑 削除</button>
                </form>
            </li>
        @endforeach
    </ul>
</body>
</html>

削除できるか実際にやってみる

この順で画面が表示されて削除されていればOK!

実際に削除されずフラグが変わっているかも確認してみる。

タスクを追加すると

この勉強するを削除する。

日付が入っていますね!

このページでやったこと

  • ルーティング (DELETE /tasks/{id}) を追加
  • モデルSoftDeletes を追加
  • コントローラー (destroy() メソッド) を作成し、データを削除
  • Bladeテンプレート に削除ボタンを追加
  • ブラウザで動作確認 → タスク削除ができるようになった!🎉