Azis Hapidin
Menggunakan Soft Delete di Laravel

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 🙂