Sadar atau tidak mungkin banyak sekali aplikasi yang kita gunakan, 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, nah implementasi-nya sebenarnya ada banyak cara. Karena saat ini kita membahas menggunakan Laravel, jadi kita ikut aja cara yang disediakan bawaan oleh Laravel.
Nantinya kita akan menambahkan field deleted_at
dengan tipe data timestamp
, field ini kita gunakan untuk memberi flag bahwa row tersebut sudah terhapus atau belum. Jika row tersebut belum terhapus maka akan berisi NULL
, tapi jika sudah terhapus maka akan berisi waktu penghapusan data tersebut. Bagaimana jika kita ingin Restore (mengembalikan) data tersebut? Cukup update kembali field deleted_at
menjadi NULL
.
Menambahkan deleted_at pada Tabel
Hal pertama yang harus kita lakukan adalah menambahkan field deleted_at
pada tabel yang ingin kita terapkan Soft Delete, pada contoh ini saya ingin menerapkan Soft Delete pada table users
. Buka terminal kemudian jalankan perintah berikut:
php artisan make:migration add_soft_delete_on_users_table
Perintah diatas akan membuat sebuah class migration xx_xx_xx_xxxxxx_add_soft_delete_on_users_table.php
, buka file tersebut kemudian ubah menjadi seperti ini:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddSoftDeleteOnUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function ($table) {
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table("users", function ($table) {
$table->dropSoftDeletes();
});
}
}
Setelah itu jalankan perintah dibawah untuk apply migration ke table users.
php artisan migrate
Gunakan Trait Soft Delete di Model
Selanjutnya kita panggil Trait Illuminate\Database\Eloquent\SoftDeletes
di model User.
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes; // <<== Tambahkan baris ini
class User extends Authenticatable
{
use SoftDeletes; // <<== Dan ini
use Notifiable;
....
}
Sampai disini harusnya fitur Soft Delete sudah bisa digunakan. Oke, kita lanjut ke bagian selanjutnya yaitu.
Pengetesan
Pada bagian pengetesan ini kita akan menggunakan fitur Laravel bernama Tinker, buka terminal/cmd lalu arahkan ke direktori project. Kemudian jalankan perintah php artisan tinker
.
Karena kita sedang mencoba menerapkan Soft Delete pada User, jadi kita buat 2 data user dummy untuk pengetesan.
Kemudian kita pastikan bahwa kedua data diatas sudah masuk ke database.
Jika hasil yang muncul kurang lebih sama seperti diatas, berarti data sudah masuk ke database. Oke, kita coba hapus data pertama yang tadi kita masukan.
Saat kita cek lagi maka data yang tersisa tinggal 1 data, yaitu data yang tadi kita masukan kedua.
Sekarang kita periksa data di database, harusnya data pertama masih ada tapi dengan deleted_at
yang tidak NULL
seperti yang saya jelaskan di pembukaan diatas.
Mulai sekarang ketika kita mencoba mengambil data dengan query biasa maka data pertama tadi tidak akan muncul, mari kita coba.
Mengambil Data yang Sudah Terhapus
Nah pertanyaannya bagaimana melakukan query untuk mengambil data yang sudah terhapus tadi? Disini kita bisa menggunakan method withTrashed()
atau onlyTrashed()
.
<?php
// Mengambil data yang belum terhapus beserta data yang sudah terhapus
$users = User::withTrashed()->where('email', '[email protected]')->get();
// HANYA mengambil data yang sudah terhapus
$users = User::onlyTrashed()->where('email', '[email protected]')->get();
Restore Data yang Sudah Terhapus
Untuk melakukan restore/mengembalikan data, kita cukup menggunakan method restore()
.
<?php
$user = User::withTrashed()->where('email', '[email protected]')->first()
// Restore data
$user->restore();
Menghapus Data Secara Permanen
Untuk menghapus data secara permanen, kita bisa menggunakan method forceDelete()
.
<?php
$user = User::withTrashed()->where('email', '[email protected]')->first()
// Hapus secara permanen
$user->forceDelete();
Sampai sini cukup jelas? Jika ada yang masih kurang jelas atau kurang di mengerti silahkan curat coret di kolom komentar.
Terima kasih atas kunjungannya 🙂