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



ソフトデリートを導入するメリット
データの復元ができる(「間違えて削除した!」→ 復元できる)
削除履歴を残せる(いつ誰が削除したか管理できる)
実際にデータを削除しないので、関連データを保持できる
ルーティングを追加
routes/web.php に DELETE のルートを追加。
Route::delete('/tasks/{id}', [TaskController::class, 'destroy']);
/tasks/{id} に DELETE リクエストを送ると destroy() が実行すできるようになります。
テーブル構造を変更する
現在のテーブル構造は
| カラム名 | データ型 | 説明 |
|---|---|---|
| id | bigint (AUTO_INCREMENT) | 主キー(自動で増加) |
| title | string (VARCHAR) | タスクの名前 |
| completed | boolean (TINYINT) | タスクの完了フラグ (true=完了, false=未完了) |
| created_at | timestamp | 作成日時(自動で設定) |
| updated_at | timestamp | 更新日時(自動で設定) |
このようになっている。
ここに、削除フラグのカラムを追加するため、マイグレーションを変更します。
新しいマイグレーションを作成
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.php の destroy() メソッドを追記します。
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テンプレート に削除ボタンを追加
- ブラウザで動作確認 → タスク削除ができるようになった!🎉









コメントを残す