Soft Deletes adalah fitur dari laravel untuk membuat penghapusan data sementara, kita bisa menghapus data pada table tapi data tersebut tidak benar-benar langsung dihapus, masih tersimpan dalam table tapi tidak tampil lagi.
Ibaratnya ketika kita menghapus sebuah data disana, sebenarnya data tersebut tidak benar-benar terhapus, contoh paling mudah adalah ketika kita menghapus file di komputer maka data tersebut tidak benar-benar hilang dari komputer kita, tapi pindah ke Recycle Bin (Windows) atau Trash (Linux dan macOS). Karena data-nya masih tersimpan, maka nantinya kita bisa mengembalikan (Restore) file tersebut atau kita juga bisa menghapus data tersebut secara permanen.
Kurang lebih seperti itu, di laravel kita tidak perlu susah-susah untuk membuat fitur semacam ini pada aplikasi kita. Laravel sudah menyediakan fitur SoftDeletes yang bisa langsung kita gunakan.
Cara Menggunakan Soft Deletes
Untuk mulai belajar tentang Soft Deletes, pastikan kita sudah memiliki sebuah database dan table yang akan kita olah. Untuk contoh saya sudah membuat database dengan nama ‘crudlaraveleloquent‘ dan table dengan nama ‘tbl_guru‘.
Jika belum ada database dan tabelnya, silahkan buat dulu database dan tablenya, dan isi beberapa data percobaan. Untuk cara membuat tablenya dan mengisi datanya kita bisa buat dan isi dengan cara manual di phpmyadmin atau bisa menggunakan migration dan menginput data dummy dengan Seeding & Faker seperti yang sudah kita pelajari pada tutorial sebelumnya. Skema table tbl_guru yang kita butuhkan adalah kolum idguru, nip, nama, alamat, created_at dan updated_at. Atau jika kita ingin cepat, kita bisa mengimport sql berikut ke database ‘crudlaraveleloquent’.
crudlaraveleloquent.sql :
-- phpMyAdmin SQL Dump
-- version 5.2.1
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Jan 30, 2025 at 05:06 AM
-- Server version: 10.4.32-MariaDB
-- PHP Version: 8.2.12
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `crudlaraveleloquent`
--
-- --------------------------------------------------------
--
-- Table structure for table `cache`
--
CREATE TABLE `cache` (
`key` varchar(255) NOT NULL,
`value` mediumtext NOT NULL,
`expiration` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `cache_locks`
--
CREATE TABLE `cache_locks` (
`key` varchar(255) NOT NULL,
`owner` varchar(255) NOT NULL,
`expiration` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `failed_jobs`
--
CREATE TABLE `failed_jobs` (
`id` bigint(20) UNSIGNED NOT NULL,
`uuid` varchar(255) NOT NULL,
`connection` text NOT NULL,
`queue` text NOT NULL,
`payload` longtext NOT NULL,
`exception` longtext NOT NULL,
`failed_at` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `jobs`
--
CREATE TABLE `jobs` (
`id` bigint(20) UNSIGNED NOT NULL,
`queue` varchar(255) NOT NULL,
`payload` longtext NOT NULL,
`attempts` tinyint(3) UNSIGNED NOT NULL,
`reserved_at` int(10) UNSIGNED DEFAULT NULL,
`available_at` int(10) UNSIGNED NOT NULL,
`created_at` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `job_batches`
--
CREATE TABLE `job_batches` (
`id` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`total_jobs` int(11) NOT NULL,
`pending_jobs` int(11) NOT NULL,
`failed_jobs` int(11) NOT NULL,
`failed_job_ids` longtext NOT NULL,
`options` mediumtext DEFAULT NULL,
`cancelled_at` int(11) DEFAULT NULL,
`created_at` int(11) NOT NULL,
`finished_at` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `migrations`
--
CREATE TABLE `migrations` (
`id` int(10) UNSIGNED NOT NULL,
`migration` varchar(255) NOT NULL,
`batch` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Dumping data for table `migrations`
--
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES
(1, '0001_01_01_000000_create_users_table', 1),
(2, '0001_01_01_000001_create_cache_table', 1),
(3, '0001_01_01_000002_create_jobs_table', 1),
(4, '2025_01_29_053527_create_guru_models_table', 1);
-- --------------------------------------------------------
--
-- Table structure for table `password_reset_tokens`
--
CREATE TABLE `password_reset_tokens` (
`email` varchar(255) NOT NULL,
`token` varchar(255) NOT NULL,
`created_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `sessions`
--
CREATE TABLE `sessions` (
`id` varchar(255) NOT NULL,
`user_id` bigint(20) UNSIGNED DEFAULT NULL,
`ip_address` varchar(45) DEFAULT NULL,
`user_agent` text DEFAULT NULL,
`payload` longtext NOT NULL,
`last_activity` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Dumping data for table `sessions`
--
INSERT INTO `sessions` (`id`, `user_id`, `ip_address`, `user_agent`, `payload`, `last_activity`) VALUES
('DA75RHLJCMRNdrj0S9Kux8JrEvaaXSYIm4mXqIXZ', NULL, '127.0.0.1', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiaHkwWDVrMWlXR1hJdnZLZlZpTUVKenN0OWY3M1BBUVo3T3JkaHJHVSI7czo5OiJfcHJldmlvdXMiO2E6MTp7czozOiJ1cmwiO3M6MjY6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9ndXJ1Ijt9czo2OiJfZmxhc2giO2E6Mjp7czozOiJvbGQiO2E6MDp7fXM6MzoibmV3IjthOjA6e319fQ==', 1738206170),
('HCqVxToJlrbiblnOCh24faLPt3upg7llLzMBOHLy', NULL, '127.0.0.1', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiZGhLeGZvOW41cE56NEJTdGVwSngwU1JXdGc0NWtOVm8wMVhnOWVXRCI7czo5OiJfcHJldmlvdXMiO2E6MTp7czozOiJ1cmwiO3M6MzM6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9ndXJ1L2VkaXQvMSI7fXM6NjoiX2ZsYXNoIjthOjI6e3M6Mzoib2xkIjthOjA6e31zOjM6Im5ldyI7YTowOnt9fX0=', 1738151547);
-- --------------------------------------------------------
--
-- Table structure for table `tbl_guru`
--
CREATE TABLE `tbl_guru` (
`idguru` int(10) UNSIGNED NOT NULL,
`nip` int(11) NOT NULL,
`nama` varchar(255) NOT NULL,
`alamat` text NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Dumping data for table `tbl_guru`
--
INSERT INTO `tbl_guru` (`idguru`, `nip`, `nama`, `alamat`, `created_at`, `updated_at`) VALUES
(1, 18, 'Prof. Kyler Walter DVM', '70138 Kohler Track Suite 828\nDallasmouth, CO 35697-8345', NULL, NULL),
(2, 18, 'Chesley Beier PhD', '2079 Carlie Trafficway Suite 599\nWolfmouth, MA 25973', NULL, NULL),
(3, 18, 'Kobe Oberbrunner', '1720 Keenan Dam Suite 160\nSouth Jana, DC 01002', NULL, NULL),
(4, 18, 'Mrs. Dariana Heathcote', '597 Rosanna Lock\nNew Danialstad, IN 05049-4449', NULL, NULL),
(5, 18, 'Daphney Koss', '685 Myrl Shores\nNew Kaelynland, AZ 67832-3612', NULL, NULL),
(6, 18, 'Dr. Lela Mann IV', '840 Reinger Pass\nCruickshankshire, TN 47783', NULL, NULL),
(7, 18, 'Shakira Mills', '944 Morissette Cliff Suite 105\nErdmanfurt, MN 49439', NULL, NULL),
(8, 18, 'Mrs. Lia Ziemann IV', '739 Dave Estates Apt. 232\nRohanfurt, AR 17535', NULL, NULL),
(9, 18, 'Gladyce Brekke', '5369 Aiden Court Suite 544\nHassieview, TX 95807-3674', NULL, NULL),
(10, 18, 'Marcos Koss', '5800 Bianka Fort\nChanelside, MT 49296', NULL, NULL);
-- --------------------------------------------------------
--
-- Table structure for table `users`
--
CREATE TABLE `users` (
`id` bigint(20) UNSIGNED NOT NULL,
`name` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`email_verified_at` timestamp NULL DEFAULT NULL,
`password` varchar(255) NOT NULL,
`remember_token` varchar(100) DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `cache`
--
ALTER TABLE `cache`
ADD PRIMARY KEY (`key`);
--
-- Indexes for table `cache_locks`
--
ALTER TABLE `cache_locks`
ADD PRIMARY KEY (`key`);
--
-- Indexes for table `failed_jobs`
--
ALTER TABLE `failed_jobs`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`);
--
-- Indexes for table `jobs`
--
ALTER TABLE `jobs`
ADD PRIMARY KEY (`id`),
ADD KEY `jobs_queue_index` (`queue`);
--
-- Indexes for table `job_batches`
--
ALTER TABLE `job_batches`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `migrations`
--
ALTER TABLE `migrations`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `password_reset_tokens`
--
ALTER TABLE `password_reset_tokens`
ADD PRIMARY KEY (`email`);
--
-- Indexes for table `sessions`
--
ALTER TABLE `sessions`
ADD PRIMARY KEY (`id`),
ADD KEY `sessions_user_id_index` (`user_id`),
ADD KEY `sessions_last_activity_index` (`last_activity`);
--
-- Indexes for table `tbl_guru`
--
ALTER TABLE `tbl_guru`
ADD PRIMARY KEY (`idguru`);
--
-- Indexes for table `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `users_email_unique` (`email`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `failed_jobs`
--
ALTER TABLE `failed_jobs`
MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `jobs`
--
ALTER TABLE `jobs`
MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `migrations`
--
ALTER TABLE `migrations`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
--
-- AUTO_INCREMENT for table `tbl_guru`
--
ALTER TABLE `tbl_guru`
MODIFY `idguru` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=14;
--
-- AUTO_INCREMENT for table `users`
--
ALTER TABLE `users`
MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Intinya kita mempunyai tabel tbl_guru dengan struktur table seperti di atas, untuk menggunakan fitur Soft Deleting kita wajib memiliki kolum deleted_at, maka kita bisa buat secara manual dengan menambahkan kolum baru di table tbl_guru melalui phpmyadmin, tambahkan 1 kolom pada table tbl_guru dengan nama “deleted_at“ dengan tipe data datetime dan DEFAULT NULL. Atau pada awal pembuatan table dengan migration kita tambahkan sintak :
$table->softDeletes();
Koneksi Database
Sebelum lanjut ke tahap soft deletes, kita konfigurasi dulu databasenya pada file .env pada project laravel kita. Pada project laravel yang digunakan untuk tutorial ini saya gunakan project dengan nama ‘crudlaraveleloquent‘. Jika belum ada projectnya silahkan buat dahulu, cara membuat projectnya silahkan baca di Cara install laravel 11 di windows .
.env
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=crudlaraveleloquent DB_USERNAME=root DB_PASSWORD=root
Menampilkan Data
Untuk menampilkan data dengan Eloquent Laravel sudah kita pelajari pada tutorial laravel sebelumnya, bisa di baca di CRUD Laravel Menggunakan Eloquent .
Untuk projectnya kita lanjutkan dari materi CRUD Laravel Menggunakan Eloquent tersebut, jika belum ada silahkan ikuti dulu materi tersebut.
Untuk tampilan data gurunya kita tambahkan sedikit sintak, dengan cara menambahkan tombol Tempat Sampah.
dengan sintak :
<a href="/guru/trash" class="btn btn-warning">Tempat Sampah</a>
Sehingga sintak dalam file crudlaraveleloquent/resources/views/guru/v_guru.blade.php menjadi seperti berikut :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" rel="stylesheet">
<title>Tutorial Laravel : CRUD Eloquent</title>
</head>
<body>
<div class="container">
<div class="card mt-5">
<div class="card-header text-center">
CRUD Data Guru
</div>
<div class="card-body">
<a href="/guru/tambah" class="btn btn-primary">Input Guru Baru</a>
|
<a href="/guru/trash" class="btn btn-warning">Tempat Sampah</a>
<br/>
<br/>
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>ID Guru</th>
<th>NIP</th>
<th>Nama</th>
<th>Alamat</th>
</tr>
</thead>
<tbody>
@foreach($var_guru as $g)
<tr>
<td>{{ $g->idguru }}</td>
<td>{{ $g->nip }}</td>
<td>{{ $g->nama }}</td>
<td>{{ $g->alamat }}</td>
<td>
<a href="/guru/edit/{{ $g->idguru }}" class="btn btn-warning">Edit</a>
<a href="/guru/hapus/{{ $g->idguru }}" class="btn btn-danger" onclick="return confirm('Yakin Mau Hapus Data?')">Hapus</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
Selanjutnya kita jalankan projectnya dengan cara di cmd/terminal ketikan :
php artisan serve
Kita lihat hasilnya dengan cara akses ke localhost:8000/guru, maka hasilnya seperti berikut :

Data guru sudah berhasil tampil, pada view v_guru membuat tombol hapus untuk menghapus sementara data guru dan akan dimasukkan ke folder atau tempat sampah ibaratnya.
Kemudian kita juga membuat menu Tempat Sampah pada bagian atas, pada saat menu Tempat Sampah diklik maka akan dialihkan ke halaman yang menampilkan data-data guru yang dihapus sementara. Pada halaman Tempat Sampah itu nanti akan kita buat juga tombol untuk menghapus data guru secara permanen atau mengembalikan (restore) dan menampilkan kembali data yang sudah dihapus tersebut.
Membuat Soft Deletes untuk Menghapus Sementara
Perhatikan pada tombol hapus yang kita buat pada view guru.blade.php :
<a href="/guru/hapus/{{ $g->idguru }}" class="btn btn-danger" onclick="return confirm('Yakin Mau Hapus Data?')">Hapus</a>
Pada saat diklik kita alihkan ke route ‘/guru/hapus/{idguru}’, maka kita buat route tersebut untuk meng-handle proses penghapusan data.
crudlaraveleloquent/routes/web.php :
Route::get('/guru/hapus/{idguru}', [GuruController::class,'gurudelete']);
Route ini akan menghandle proses penghapusan kita arahkan ke method gurudelete() dalam controller GuruController.php, sambil mengirimkan id guru yang akan dihapus. Selanjutnya kita buat method gurudelete() pada controller GuruController.php .
crudlaraveleloquent/app/Http/controllers/GuruController.php :
// hapus sementara
public function gurudelete($idguru)
{
$dataguru = GuruModel::find($idguru);
$dataguru->delete();
return redirect('/guru');
}
Proses penghapusan data pada method gurudelete() di atas masih sama seperti yang sudah kita pelajari sebelumnya yaitu menggunakan fungsi delete(); . Karena di sini kita akan menggunakan Fitur Soft Delete, maka perlu beberapa pengaturan pada model GuruModel.php. Buka file model GuruModel.php dan sesuaikan seperti berikut :
crudlaraveleloquent/app/Models/GuruModel.php :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class GuruModel extends Model
{
use SoftDeletes;
protected $table = 'tbl_guru';
protected $primaryKey = 'idguru'; // Primary key
protected $fillable = [
'nip',
'nama',
'alamat'
];
protected $dates = ['deleted_at'];
}
Karena kita akan menggunakan fitur SoftDeletes, maka kita harus menggunakan sintak :
use SoftDeletes;
Dan memanggil library-nya terlebih dulu pada model dengan sintak :
use Illuminate\Database\Eloquent\SoftDeletes;
Unruk library kita tidak perlu tulis manual, ketika kita mengetikan use SoftDeletes; kita klik caja librarynya.
Kemudian di dalam class kita deklarasikan variabel protected $dates.
protected $dates = ['deleted_at'];
Sekarang kita coba klik tombol hapus pada salah satu data guru, setelah klik hapus maka data guru tersebut akan hilang dan tidak terlihat lagi, tapi pada database data tersebut masih ada.
Data guru yang sudah kita hapus tadi tidak terlihat lagi, tapi pada database masih ada. Pada kolum deleted_at record data yang dihapus tadi terisi dengan waktu kapan data tersebut dihapus.
Sampai disini kita telah berhasil membuat penghapusan data sementara. dimana data yang kita hapus tadi ibaratnya seperti kita masukkan ke tempat sampah.

Pada contoh di atas saya menghapus data guru yang bernama Latif Ardianto, setelah tombol Hapus diklik data di tampilan view guru.blade.php, tetapi di phpmyadmin masih ada dan kolom delete_at jadi terisi. Ini artinya soft deletes yang dibuat berhasil.
Menampilkan Data yang Dihapus (Isi tempat sampah)
Pada halaman view v_guru.blade.php kita telah membuat menu Tempat Sampah. Pada menu ini nantinya akan menampilkan halaman yang menampilkan data-data yang sudah dihapus (tempat sampah).
<a href="/guru/trash">Tempat Sampah</a>
Pada saat menu/link Tempat Sampah diklik, maka akan dialihkan ke route ‘/guru/trash’. Selanjutnya kita buat route baru, yaitu route ‘/guru/trash’.
crudlaraveleloquent/routes/web.php :
Route::get('/guru/trash', [GuruController::class,'gurutrash']);
Route ini akan menjalankan method gurutrash() pada controller GuruController.php, selanjutnya buat method gurutrash() pada controller GuruController.php.
crudlaraveleloquent/app/Http/controllers/GuruController.php :
// menampilkan data guru yang sudah dihapus
public function gurutrash()
{
$dataguru = GuruModel::onlyTrashed()->get();
return view('guru/v_gurutrash', ['var_guru' => $dataguru]);
}
Untuk penamaan methodnya bebas, kita bisa menyesuaikan sendiri misal gurutrash() diganti dengan sampah() atau sebagainya, pada method gurutrash() ini kita ambil data guru yang sudah dihapus dengan menggunakan fungsi GuruModel::onlyTrashed()->get(); , kemudian tinggal kita passing ke view v_gurutrash.blade.php. Selanjutnya kita buat view baru dengan nama v_gurutrash.blade.php .
crudlaraveleloquent/resources/views/guru/v_gurutrash.blade.php :
<!DOCTYPE html>
<html>
<head>
<title>Tutorial Laravel : Soft Deletes Laravel</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="card mt-5">
<div class="card-header text-center">
Data Guru
</div>
<div class="card-body">
<a href="/guru">Data Guru</a>
|
<a href="/guru/trash" class="btn btn-sm btn-primary">Tempat Sampah</a>
<br/>
<br/>
<a href="/guru/kembalikan_semua" onclick="return confirm('Yakin Mau Kembalikan Semua Data?')">Kembalikan Semua</a>
|
<a href="/guru/hapus_permanen_semua" onclick="return confirm('Yakin Mau Hapus Semua Data Secara Permanen?')">Hapus Permanen Semua</a>
<br/>
<br/>
<table class="table table-bordered">
<thead>
<tr>
<th>NIP</th>
<th>Nama</th>
<th>Alamat</th>
<th width="30%">OPSI</th>
</tr>
</thead>
<tbody>
@foreach($var_guru as $g)
<tr>
<td>{{ $g->nip }}</td>
<td>{{ $g->nama }}</td>
<td>{{ $g->alamat }}</td>
<td>
<a href="/guru/kembalikan/{{ $g->idguru }}" class="btn btn-success btn-sm" onclick="return confirm('Yakin Mau Kembalikan Data?')" >Restore</a>
<a href="/guru/hapus_permanen/{{ $g->idguru }}" class="btn btn-danger btn-sm" onclick="return confirm('Yakin Mau Hapus Data Secara Permanen?')">Hapus Permanen</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
Sekarang kita lihat hasilnya, klik pada tombol Tempat Sampah atau akses url localhost:8000/guru/trash. Maka akan muncul isi tempat sampah, atau data guru-guru yang sudah kita hapus sebelumnya.

Restore Data yang dihapus
Pada view v_gurutrash.blade.php kita telah membuat sebuah tombol restore.
<a href="/guru/kembalikan/{{ $g->idguru }}" class="btn btn-success btn-sm" onclick="return confirm('Yakin Mau Kembalikan Data?')" >Restore</a>
Yang mengarahkan ke route ‘/guru/kembalikan/idguru’, sekarang kita buat routenya dahulu.
crudlaraveleloquent/routes/web.php :
Route::get('/guru/kembalikan/{idguru}', [GuruController::class,'gurukembalikan']);
Seperti proses penghapusan data, di sini kita mengirimkan data idguru ke controller. Pada route ini kita kirimkan idguru ke method gurukembalikan() dalam controller GuruController.php. Kita buat method gurukembalikan() dalam controller GuruController.php.
crudlaraveleloquent/app/Http/controllers/GuruController.php :
// restore data guru yang dihapus
public function gurukembalikan($idguru)
{
$dataguru = GuruModel::onlyTrashed()->where('idguru',$idguru);
$dataguru->restore();
return redirect('/guru/trash');
}
Pada method ini kita menangkap idguru yang ingin dikembalikan dalam parameter method gurukembalikan(), kemudian kita seleksi terlebih dulu data guru yang ada pada tempat sampah dan yang idguru nya sesuai dengan idguru yang ingin direstore, kemudian kita kembalikan/restore dengan fungsi restore().
$dataguru = GuruModel::onlyTrashed()->where('idguru',$idguru);
$dataguru->restore();
Kemudian kita alihkan halaman kembali ke route ‘/guru/trash’. Sekarang kita coba klik tombol restore pada data guru yang ingin di kembalikan, maka data guru tersebut akan dikembalikan (ditampilkan kembali), dan catatan pada kolom created_at dalam table tbl_guru akan kembali Null.
Restore semua Data sang sudah sihapus sekaligus
Ketika data yang akan direstore di Tempat Sampah sangat banyak, meretore data tesebut satu-persatu tentu akan melelahkan dan menyita banyak waktu. Solusinya kita buatkan juga fitur untuk merestore semua data guru yang ada di tempat sampah.
Pada view v_gurutrash.blade.php kita sudah membuat link/menu untuk merestore atau mengembalikan semua data yang ada di tempat sampah.
<a href="/guru/kembalikan_semua" onclick="return confirm('Yakin Mau Kembalikan Semua Data?')">Kembalikan Semua</a>
Saat link ini diklik, halaman akan dialihkan ke route ‘/guru/kembalikan_semua’, sekarang kita buat route tersebut.
crudlaraveleloquent/routes/web.php :
Route::get('/guru/kembalikan_semua', [GuruController::class,'gurukembalikan_semua']);
Route ini menjalankan method gurukembalikan_semua() pada controller GuruController.php, sekrang kita buat method tersebut :
crudlaraveleloquent/app/Http/controllers/GuruController.php :
//restore semua data guru yang sudah dihapus
public function gurukembalikan_semua()
{
$dataguru = GuruModel::onlyTrashed();
$dataguru->restore();
return redirect('/guru/trash');
}
Perhatikan pada method tersebut, pertama kita ambil semua data yang ada di tempat sampah dan kita simpan dalam variabel $dataguru, kemudian kita kembalikan semua data tersebut dengan fungsi restore().
$dataguru = GuruModel::onlyTrashed(); $dataguru->restore();
Dan terakhir kita alihkan halaman kembali ke route ‘/guru/trash’. Sekarang coba klik hapus pada beberapa data guru, kemudian masuk ke menu tempat sampah dan klik pada link kembalikan semua. Maka semua data yang ada di tempat sampah akan di restore atau kembali ditampilkan, dan catatan pada kolom created_at dalam table tbl_guru akan kembali Null.
Hapus permanen Data yang dihapus
Untuk menghapus secara permanen, perhatikan pada tombol hapus permanen pada view v_gurutrash.blade.php.
<a href="/guru/hapus_permanen/{{ $g->idguru }}" class="btn btn-danger btn-sm" onclick="return confirm('Yakin Mau Hapus Data Secara Permanen?')">Hapus Permanen</a>
Tombol ini kita arahkan ke route ‘/guru/hapus_permanen/idguru’, sekarang buat route baru lagi.
laravel_laravel/routes/web.php :
Route::get('/guru/hapus_permanen/{idguru}', [GuruController::class,'guruhapus_permanen']);
Route ini akan menjalankan method guruhapus_permanen() pada controller GuruController.php sambil mengirimkan data idguru yang akan dihapus secara permanen, sekarang kita buat method guruhapus_permanen().
laravel_laravel/app/Http/controllers/GuruController.php :
// hapus permanen
public function guruhapus_permanen($idguru)
{
// hapus permanen data guru
$dataguru = Guru::onlyTrashed()->where('idguru',$idguru);
$dataguru->forceDelete();
return redirect('/guru/trash');
}
Pada method guruhapus_permanen() ini kita tangkap data yang dikirim dari route, kemudian kita seleksi data gurunya berdasarkan idguru dan yang ada di tempat sampah dengan menggunakan fungsi forceDelete() untuk menghapus data tersebut secara permanan, sehinga data benar-benar dihapus dari table guru.
Hapus permanen semua Data yang sudah dihapus sekaligus
Untuk menghapus semua data yang ada di tempat sampah secara permanen, sama caranya seperti membuat fungsi restore untuk semua data guru, bedanya pada proses hapus permanen kita gunakan fungsi forceDelete().
Pada view guru_trash.blade.php kita sudah membuat link Hapus Permanen Semua.
<a href="/guru/hapus_permanen_semua" onclick="return confirm('Yakin Mau Hapus Semua Data Secara Permanen?')">Hapus Permanen Semua</a>
Saat diklik kita arahkan ke route ‘/guru/hapus_permanen_semua’, sekarang kita buat routenya.
crudlaraveleloquent/routes/web.php :
Route::get('/guru/hapus_permanen_semua', [GuruController::class,'guruhapus_permanen_semua']);
Route ini akan menjalankan method guruhapus_permanen_semua() dalam controller GuruController.php, sekarang kita buat method tersebut dalam controller GuruController.php.
crudlaraveleloquent/app/Http/controllers/GuruController.php :
// hapus permanen semua guru yang sudah dihapus
public function guruhapus_permanen_semua()
{
// hapus permanen semua data guru yang sudah dihapus
$dataguru = GuruModel::onlyTrashed();
$dataguru->forceDelete();
return redirect('/guru/trash');
}
Pada method guruhapus_permanen_semua() kita ambil semua data guru yang ada di tempat sampah, kemudian kita hapus permanen dengan fungsi forceDelete() dan terakhir kita alihkan halaman ke route ‘/guru/trash’. Ketika kita klik tombol tersebut maka data di Tempat Sampah pun hilang, begitu juga di dalam table tbl_guru nya juga sudah terhapus permanen.

Sampai di sini tutorial Soft Delete Laravel telah selesai, semoga bermanfaat. Selanjutnya kita akan belajar tentang Membuat Pagination dan Pencarian .
Referensi :
- https://www.malasngoding.com/soft-deletes-laravel/