Dalam pengelolaan data, menghapus data dari database secara permanen sering kali bukan pilihan terbaik. Laravel menyediakan fitur elegan bernama Soft Deletes yang memungkinkan kita “menghapus” data tanpa benar-benar menghilangkannya dari tabel. Data yang dihapus hanya ditandai, dan tetap bisa diakses atau bahkan dikembalikan (restore) di kemudian hari.
Tutorial ini akan memandu Anda dalam mengimplementasikan Soft Deletes pada model Eloquent.
Apa Itu Soft Deletes?
Soft Deletes adalah mekanisme di mana data yang dihapus tidak benar-benar dihilangkan dari database. Laravel melakukannya dengan menambahkan kolom deleted_at ke dalam tabel Anda. Saat sebuah record dihapus, Laravel tidak menjalankan perintah DELETE SQL, melainkan hanya mengisi kolom deleted_at dengan waktu saat penghapusan terjadi.
Dengan begitu, data tersebut akan dianggap “tidak ada” oleh query Eloquent yang normal, namun tetap tersimpan di database.
Mengapa Menggunakan Soft Deletes?
- Keamanan Data: Mencegah kehilangan data yang tidak disengaja.
- Audit Trail: Memungkinkan Anda melacak kapan dan data apa yang “dihapus”.
- Kemudahan Restore: Data dapat dikembalikan (restore) dengan mudah.
- Integritas Relasi: Menjaga integritas data berelasi, karena foreign key tidak terputus.
Langkah 1: Modifikasi Migration
Untuk mengaktifkan Soft Deletes, Anda perlu menambahkan kolom deleted_at ke dalam tabel Anda. Cara termudah adalah dengan memodifikasi migration Anda atau membuat migration baru.
Jika Anda membuat tabel baru, tambahkan $table->softDeletes(); di dalam migration:
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->timestamps();
$table->softDeletes(); // Menambahkan kolom `deleted_at`
});
Jika Anda ingin menambahkan Soft Deletes ke tabel yang sudah ada (misalnya, tabel posts), buat migration baru:
php artisan make:migration add_soft_deletes_to_posts_table --table=posts
Kemudian, modifikasi file migration tersebut:
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->softDeletes();
});
}
public function down()
{
Schema::table('posts', function (Blueprint $table) {
$table->dropSoftDeletes();
});
}
Setelah itu, jalankan migration Anda:
php artisan migrate
Sekarang, tabel Anda memiliki kolom deleted_at.
Langkah 2: Mengaktifkan di Model
Langkah selanjutnya adalah memberi tahu model Anda untuk menggunakan Soft Deletes. Buka model yang sesuai (misalnya, app/Models/Post.php) dan tambahkan trait SoftDeletes.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use HasFactory, SoftDeletes;
// ...
}
use SoftDeletes;: Menggunakan traitSoftDeletesyang disediakan oleh Laravel.
Langkah 3: Berinteraksi dengan Soft Deletes
Setelah kedua langkah di atas selesai, Eloquent akan secara otomatis mengelola penghapusan data.
Menghapus Data (Soft Delete)
Untuk menghapus data, Anda cukup memanggil metode delete() seperti biasa.
use App\Models\Post;
$post = Post::find(1);
$post->delete(); // Kolom `deleted_at` akan terisi
Sekarang, jika Anda mencoba mengakses data tersebut dengan query normal, Eloquent akan menganggapnya tidak ada.
Mengambil Data yang Dihapus (Soft Deleted)
Secara default, query Eloquent tidak akan menyertakan data yang sudah di-soft delete. Untuk mengambilnya, gunakan metode withTrashed().
// Mengambil semua data, termasuk yang di-soft delete
$posts = Post::withTrashed()->get();
// Mencari satu data, termasuk yang di-soft delete
$post = Post::withTrashed()->find(1);
Mengambil Hanya Data yang Dihapus
Jika Anda hanya ingin mengambil data yang sudah di-soft delete, gunakan metode onlyTrashed().
$deletedPosts = Post::onlyTrashed()->get();
Mengembalikan Data (Restore)
Untuk mengembalikan data yang sudah di-soft delete, gunakan metode restore().
$post = Post::withTrashed()->find(1);
$post->restore(); // Mengubah nilai `deleted_at` menjadi NULL
Menghapus Permanen (Force Delete)
Jika Anda benar-benar ingin menghapus data secara permanen dari database, gunakan metode forceDelete().
$post = Post::withTrashed()->find(1);
$post->forceDelete(); // Menjalankan perintah DELETE SQL
Kesimpulan
Soft Deletes adalah fitur yang sangat kuat dan fleksibel dari Laravel. Dengan sedikit modifikasi pada migration dan model, Anda dapat menambahkan lapisan keamanan dan fleksibilitas pada manajemen data Anda. Anda dapat dengan mudah melacak data yang “dihapus”, mengembalikannya jika diperlukan, atau menghapusnya secara permanen. Penggunaan Soft Deletes sangat direkomendasikan untuk data-data penting yang tidak seharusnya hilang dari database.