Soft Deletes Laravel
Apa itu Soft Delete ? dan bagaimana cara membuat atau menggunakan Soft Delete di Laravel? Berikut penjelasan dan contohnya.
Pengertian Soft Deletes Laravel
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.
Saya analogikan, dengan fitur soft deletes ini, ibaratnya kita bisa memasukkan data ke tong sampah. seperti recycle bin misalnya jika di OS windows. nah, data yang sudah kita masukkan ke tong sampah tersebut bisa kita tampilkan kembali atau bisa juga kita hapus secara permanen.
Misal nya lagi, ibaratnya ada beberapa barang di atas meja teman-teman. teman-teman bisa membuang barang-barang tersebut ke tong sampah yang ada di dekat meja, nah pasti teman-teman masih bisa mengambil barang yang sudah dibuang tadi, dan diletakkan kembali ke atas meja. Atau mungkin teman-teman juga bisa membuang barang tersebut untuk selamanya dengan cara membakar barang tersebut.
Jika teman-teman pernah menggunakan CMS WordPress, saat teman-teman menghapus postingan artikel, maka data postingan tersebut tidak langsung dihapus, tapi akan masuk ke menu trash (sampah). kita masih bisa menampilkan kembali (restore) postingan yang sudah dihapus tersebut. dan kita juga bisa menghapus postingan tersebut secara permanen.
Nah, 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 teman-teman sudah memiliki sebuah database dan table yang akan kita olah. Di sini saya sudah membuat sebuah table dengan nama βguruβ sebagai contoh, di dalam database βbelajar_laravelβ.
Persiapan
silahkan teman-teman buat dulu table guru, dan isi beberapa data percobaan. teman-teman bisa menggunakan migration dan menginput data dummy dengan Seeding & Faker seperti yang sudah kita pelajari pada tutorial sebelumnya.
Baca :
Jika teman-teman ingin membuat table guru nya secara manual juga bisa, yang kita butuhkan adalah kolum id, nama, umur, created_at, updated_at dan deleted_at.
Atau jika teman-teman ingin cepat, teman-teman bisa mengimport sql berikut ke database βbelajar_laravelβ.
guru.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
— phpMyAdmin SQL Dump
— version 4.8.3
— https://www.phpmyadmin.net/
—
— Host: localhost:3306
— Generation Time: Jan 10, 2019 at 07:36 AM
— Server version: 5.7.23
— PHP Version: 7.2.10
SET SQL_MODE = “NO_AUTO_VALUE_ON_ZERO”;
SET time_zone = “+00:00”;
—
— Database: `belajar_laravel`
—
— ——————————————————–
—
— Table structure for table `guru`
—
CREATE TABLE `guru` (
`id` int(10) UNSIGNED NOT NULL,
`nama` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`umur` int(11) NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
—
— Dumping data for table `guru`
—
INSERT INTO `guru` (`id`, `nama`, `umur`, `created_at`, `updated_at`, `deleted_at`) VALUES
(2, ‘Fitria Gilda Hastuti S.Pd’, 40, NULL, NULL, NULL),
(3, ‘Ana Mayasari S.Gz’, 34, NULL, NULL, NULL),
(4, ‘Cemeti Gunarto’, 33, NULL, NULL, NULL),
(5, ‘Gangsa Samosir’, 41, NULL, NULL, NULL),
(6, ‘Salwa Wastuti’, 44, NULL, NULL, NULL),
(7, ‘Cici Oliva Puspita’, 37, NULL, NULL, NULL),
(8, ‘Dartono Kusumo’, 36, NULL, NULL, NULL),
(9, ‘Hardi Asmadi Uwais S.Ked’, 26, NULL, NULL, NULL),
(10, ‘Gina Halimah’, 39, NULL, NULL, NULL);
—
— Indexes for dumped tables
—
—
— Indexes for table `guru`
—
ALTER TABLE `guru`
ADD PRIMARY KEY (`id`);
—
— AUTO_INCREMENT for dumped tables
—
—
— AUTO_INCREMENT for table `guru`
—
ALTER TABLE `guru`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;
|
Pokoknya intinya kita membutuhkan sebuah kolum tambahan dengan nama βdeleted_atβ.
Karena kita wajib memiliki kolum deleted_at untuk menggunakan fitur Soft Deleting.
Jika teman-teman belum punya kolum deleted_at, bisa teman-teman buat secara manual dengan menambahkan kolum baru di table guru melalui phpmyadmin.
Oke sampai di sini saya anggap teman-teman sudah punya database belajar_laravel, dan sudah punya table guru seperti pada gambar di atas.
Koneksi Database
Silahkan teman-teman konfigurasi dulu databasenya pada file .env.
.env
1
2
3
4
5
6
|
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=belajar_laravel
DB_USERNAME=root
DB_PASSWORD=root
|
Menampilkan Data
Untuk menampilkan data dengan Eloquent Laravel sudah kita pelajari pada tutorial laravel sebelumnya.
Buat route untuk menampilkan data guru.
belajar_laravel/routes/web.php
1
|
Route::get(‘/guru’, ‘GuruController@index’);
|
Route β/guruβ yang kita buat di atas, akan menjalankan method index() yang ada dalam controller GuruController.
Karena kita belum punya controller GuruController.php, maka sekarang kita buat dulu controller GuruController.php menggunakan php artisan seperti biasa.
Masuk ke direktori project laravel melalui terminal atau CMD. dan buat controller dengan php artisan.
1
|
php artisan make:controller GuruController
|
Kemudian buat fungsi/method index() pada controller GuruController.php.
belajar_laravel/app/Http/controllers/GuruController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Guru;
class GuruController extends Controller
{
// menampilkan data guru
public function index()
{
$guru = Guru::All();
return view(‘guru’, [‘guru’ => $guru]);
}
}
|
Perhatikan pada controller di atas, kita memanggil model Guru.php, karena kita akan menampilkan data dari table guru.
1
|
use App\Guru;
|
Selanjutnya seperti biasa, kita ambil data dari table guru dengan fungsi all() dan kita passing ke view guru.blade.php.
1
2
3
4
5
6
|
// menampilkan data guru
public function index()
{
$guru = Guru::All();
return view(‘guru’, [‘guru’ => $guru]);
}
|
karena kita belum mempunyai model Guru.php dan view guru.blade.php, maka akan kita buat kedua file tersebut.
Buat model dengan nama Guru.php.
1
|
php artisan make:model Guru
|
Pada model Guru.php, kita deklarasikan dulu bahwa kita akan menggunakan table dengan nama βguruβ, bukan βgurusβ (plural model eloquent).
belajar_laravel/app/Guru.php
1
2
3
4
5
6
7
8
9
10
|
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Guru extends Model
{
protected $table = “guru”;
}
|
Oke, selanjutnya karena tadi pada controller data gurunya kita passing ke view guru.blade.php, maka kita buat sebuah file view baru dengan nama guru.blade.php.
belajar_laravel/resources/views/guru.blade.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
<!DOCTYPE html>
<html>
<head>
<title>Tutorial Laravel #22 : 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 | <a href=“https://www.malasngoding.com/laravel”>www.malasngoding.com</a>
</div>
<div class=“card-body”>
<a href=“/guru” class=“btn btn-sm btn-primary”>Data Guru</a>
|
<a href=“/guru/trash”>Tong Sampah</a>
<br/>
<br/>
<table class=“table table-bordered”>
<thead>
<tr>
<th>Nama</th>
<th>Umur</th>
<th width=“1%”>OPSI</th>
</tr>
</thead>
<tbody>
@foreach($guru as $g)
<tr>
<td>{{ $g–>nama }}</td>
<td>{{ $g–>umur }}</td>
<td><a href=“/guru/hapus/{{ $g->id }}” class=“btn btn-danger btn-sm”>Hapus</a></td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
|
Oke, kita lihat hasilnya dulu, baru kemudian kita terapkan soft deleting eloquent laravel.
Jalankan project
php artisan serve
dan akses
localhost:8000/guru
maka hasilnya seperti berikut.
Data guru sudah berhasil tampil. seperti yang teman-teman lihat pada view guru, di sana kita membuat tombol hapus untuk menghapus sementara data guru dan akan dimasukkan ke folder atau tong sampah ibaratnya.
Kemudian kita juga membuat menu tong sampah pada bagian atas, saat menu tong sampah di klik, maka akan di alihkan ke halaman yang menampilkan data-data guru yang di hapus sementara. pada halaman tong 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,
1
|
<a href=“/guru/hapus/{{ $g->id }}” class=“btn btn-danger btn-sm”>Hapus</a>
|
Pada saat diklik kita alihkan ke route β/guru/hapus/{id}β.
Maka sekarang kita buat route tersebut, untuk meng-handle proses penghapusan data.
belajar_laravel/routes/web.php
1
|
Route::get(‘/guru/hapus/{id}’, ‘GuruController@hapus’);
|
route ini akan menghandle proses penghapusan, kita arahkan ke method hapus() dalam controller GuruController.php, sambil mengirimkan id guru yang akan dihapus.
buat method hapus() pada controller GuruController.php
belajar_laravel/app/Http/controllers/GuruController.php
1
2
3
4
5
6
7
8
|
// hapus sementara
public function hapus($id)
{
$guru = Guru::find($id);
$guru–>delete();
return redirect(‘/guru’);
}
|
Proses penghapusan data pada method hapus() di atas masih sama seperti yang sudah kita pelajari sebelumnya.
Belum selesai sampai di sini, karena kita di sini akan menggunakan Fitur Soft Delete, maka perlu beberapa pengaturan pada model Guru.php.
Buka file model Guru.php, dan sesuaikan seperti berikut.
belajar_laravel/app/Guru.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Guru extends Model
{
use SoftDeletes;
protected $table = “guru”;
protected $dates = [‘deleted_at’];
}
|
Karena kita akan menggunakan fitur SoftDeletes, maka kita harus memanggilnya terlebih dulu pada model.
1
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
dan kemudian di dalam class, kita deklarasikan variabel protected $dates.
1
|
protected $dates = [‘deleted_at’];
|
Oke selesai teman-teman. Sekarang kita coba klik tombol hapus pada data guru. disini saya mencontohkan dengan menghapus data guru yang bernama βcemeti gunartoβ.
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 tong sampah.
Menampilkan Data yang Dihapus (Isi tong sampah)
Pada halaman view guru.blade.php yang kita buat sebelumnya, kita telah membuat menu tong sampah. pada menu ini nantinya akan menampilkan halaman yang menampilkan data-data yang sudah dihapus (tong sampah).
1
|
<a href=“/guru/trash”>Tong Sampah</a>
|
Pada saat menu/link Tong sampah diklik, maka akan dialihkan ke route β/guru/trashβ.
Sekarang buat route baru, yaitu route β/guru/trashβ.
belajar_laravel/routes/web.php
1
|
Route::get(‘/guru/trash’, ‘GuruController@trash’);
|
route ini akan menjalankan method trash() pada controller GuruController.php. buat method trash() pada controller GuruController.php.
belajar_laravel/app/Http/controllers/GuruController.php
1
2
3
4
5
6
7
|
// menampilkan data guru yang sudah dihapus
public function trash()
{
// mengampil data guru yang sudah dihapus
$guru = Guru::onlyTrashed()->get();
return view(‘guru_trash’, [‘guru’ => $guru]);
}
|
Sebenarnya penamaan method nya bebas terserah teman-teman, teman-teman bisa menyesuaikan sendiri sesuai kemauan.
nah, pada method trash() ini kita ambil data guru yang sudah dihapus dengan menggunakan fungsi Guru::onlyTrashed()->get();.
Kemudian tinggal kita passing ke view guru_trash.blade.php.
Buat view guru_trash.blade.php
belajar_laravel/resources/views/guru_trash.blade.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
<!DOCTYPE html>
<html>
<head>
<title>Tutorial Laravel #22 : 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 | <a href=“https://www.malasngoding.com/laravel”>www.malasngoding.com</a>
</div>
<div class=“card-body”>
<a href=“/guru”>Data Guru</a>
|
<a href=“/guru/trash” class=“btn btn-sm btn-primary”>Tong Sampah</a>
<br/>
<br/>
<a href=“/guru/kembalikan_semua”>Kembalikan Semua</a>
|
<a href=“/guru/hapus_permanen_semua”>Hapus Permanen Semua</a>
<br/>
<br/>
<table class=“table table-bordered”>
<thead>
<tr>
<th>Nama</th>
<th>Umur</th>
<th width=“30%”>OPSI</th>
</tr>
</thead>
<tbody>
@foreach($guru as $g)
<tr>
<td>{{ $g–>nama }}</td>
<td>{{ $g–>umur }}</td>
<td>
<a href=“/guru/kembalikan/{{ $g->id }}” class=“btn btn-success btn-sm”>Restore</a>
<a href=“/guru/hapus_permanen/{{ $g->id }}” class=“btn btn-danger btn-sm”>Hapus Permanen</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
|
Sekarang kita lihat hasilnya, klik pada link tong sampah, atau akses url localhost:8000/guru/trash.
Maka akan muncul isi tong sampah, atau data guru-guru yang sudah kita hapus sebelumnya.
Mantap.
Restore Data Yang Dihapus
Pada view guru_trash.blade.php kita telah membuat sebuah tombol restore.
1
|
<a href=“/guru/kembalikan/{{ $g->id }}” class=“btn btn-success btn-sm”>Restore</a>
|
Yang mengarahkan ke route β/guru/kembalikan/id_guruβ. jadi sekarang kita buat route tersebut.
belajar_laravel/routes/web.php
1
|
Route::get(‘/guru/kembalikan/{id}’, ‘GuruController@kembalikan’);
|
Sama seperti proses penghapusan data, di sini kita mengirimkan data id guru ke controller. pada route ini kita kirimkan id guru ke method kembalikan() dalam controller GuruController.php.
Buat method kembalikan() dalam controller GuruController.php.
belajar_laravel/app/Http/controllers/GuruController.php
1
2
3
4
5
6
7
|
// restore data guru yang dihapus
public function kembalikan($id)
{
$guru = Guru::onlyTrashed()->where(‘id’,$id);
$guru–>restore();
return redirect(‘/guru/trash’);
}
|
pada method ini, kita menangkap id guru yang ingin dikembalikan dalam parameter method kembalikan().
Kemudian kita seleksi terlebih dulu data guru yang ada pada tong sampah dan yang id nya sesuai dengan id guru yang ingin direstore. kemudian kita kembalikan/restore dengan fungsi restore().
1
2
|
$guru = Guru::onlyTrashed()->where(‘id’,$id);
$guru–>restore();
|
kemudian kita alihkan halaman kembali ke route β/guru/trashβ.
kita coba, klik tombol restore pada data guru yang ingin di kembalikan.
Maka data guru tersebut akan dikembalikan (ditampilkan kembali).
Restore Semua Data Yang Sudah Dihapus Sekaligus
Sip. sampai di sini aplikasi crud guru dengan fitur soft delete ini sudah bagus. tapi supaya lebih senpurna akan kita buatkan juga fitur untuk merestore semua data guru yang ada di tong sampah. karena pasti pengguna akan kesulitan jika harus merestore satu per satu data guru dari tong sampah.
Pada view guru_trash.blade.php kita sudah membuat link/menu untuk merestore atau mengembalikan semua data yang ada di tong sampah.
1
|
<a href=“/guru/kembalikan_semua”>Kembalikan Semua</a>
|
saat link ini diklik, akan dialihkan halaman ke route β/guru/kembalikan_semuaβ. buat route tersebut.
belajar_laravel/routes/web.php
1
|
Route::get(‘/guru/kembalikan_semua’, ‘GuruController@kembalikan_semua’);
|
reoute ini menjalankan method kembalikan_semua() pada controller GuruController.php.
belajar_laravel/app/Http/controllers/GuruController.php
1
2
3
4
5
6
7
8
9
|
/ restore semua data guru yang sudah dihapus
public function kembalikan_semua()
{
$guru = Guru::onlyTrashed();
$guru–>restore();
return redirect(‘/guru/trash’);
}
|
Perhatikan pada method tersebut. pertama kita ambil semua data yang ada di tong sampah dan kita simpan dalam variabel $guru, kemudian kita kembalikan semua data tersebut dengan fungsi restore().
1
2
|
$guru = Guru::onlyTrashed();
$guru–>restore();
|
dan terakhir tinggal kita alihkan halaman kembali ke route β/guru/trashβ.
Sekarang coba klik hapus pada beberapa data guru. kemudian masuk ke menu tong sampah. dan klik pada link kembalikan semua.
Maka semua data yang ada di tong sampah akan di restore atau kembali ditampilkan.
Hapus Permanen Data Yang Dihapus
Untuk menghapus secara permanen, perhatikan pada tombol hapus permanen pada view guru_trash.blade.php.
1
|
<a href=“/guru/hapus_permanen/{{ $g->id }}” class=“btn btn-danger btn-sm”>Hapus Permanen</a>
|
tombol ini kita arahkan ke route β/guru/hapus_permanen/id guruβ. sekarang buat route baru lagi.
belajar_laravel/routes/web.php
1
|
Route::get(‘/guru/hapus_permanen/{id}’, ‘GuruController@hapus_permanen’);
|
route ini akan menjalankan method hapus_permanen() pada controller GuruController.php. sambil mengirimkan data id guru yang akan dihapus secara permanen.
buat method hapus_permanen().
belajar_laravel/app/Http/controllers/GuruController.php
1
2
3
4
5
6
7
8
9
|
// hapus permanen
public function hapus_permanen($id)
{
// hapus permanen data guru
$guru = Guru::onlyTrashed()->where(‘id’,$id);
$guru–>forceDelete();
return redirect(‘/guru/trash’);
}
|
pada method hapus_permanen() ini, kita tangkap data yang dikirim dari route, kemudian kita seleksi data gurunya berdasarkan id dan yang ada di tong sampah tentunya. sama seperti saat kita membuat restore. hanya saja pada proses hapus permanen ini kita gunakan fungsi forceDelete() untuk menghapus data tersebut secara permanan.
Sehinga data benar-benar di hapus dan menghilang dari table guru.
Menghapus Permanen Semua Data Yang Sudah Dihapus Sekaligus
Untuk menghapus semua data yang ada di tong sampah secara permanen, sama caranya seperti membuat fungsi restore untuk semua data guru.
bedanya pada proses hapus permanen kita gunakan fungsi forceDelete.
Perhatikan link Hapus Permanen Semua pada view guru_trash.blade.php.
1
|
<a href=“/guru/hapus_permanen_semua”>Hapus Permanen Semua</a>
|
Saat diklik, kita arahkan ke ruote β/guru/hapus_permanen_semuaβ.
Buat routenya.
belajar_laravel/routes/web.php
1
|
Route::get(‘/guru/hapus_permanen_semua’, ‘GuruController@hapus_permanen_semua’);
|
route ini kita perintah untuk menjalankan method hapus_permanen_semua() dalam controller GuruController.php.
Sekarang kita buat method tersebut dalam controller GuruController.php.
belajar_laravel/app/Http/controllers/GuruController.php
1
2
3
4
5
6
7
8
9
|
// hapus permanen semua guru yang sudah dihapus
public function hapus_permanen_semua()
{
// hapus permanen semua data guru yang sudah dihapus
$guru = Guru::onlyTrashed();
$guru–>forceDelete();
return redirect(‘/guru/trash’);
}
|
Pada method hapus_permanen_semua() ini, kita ambil semua data guru yang ada di tong sampah, kemudian kita hapus permanen dengan fungsi forceDelete(). dan terakhir kita alihkan halaman ke route β/guru/trashβ.
Oke, selesai sudah teman-teman materi laravel tentang Soft Delete Laravel.
Silahkan teman-teman download full source code soft delete eloquent laravel pada link berikut.