Menambahkan Kolom Soft Delete dalam Migrasi Laravel
Dalam pengembangan aplikasi, terkadang kita tidak ingin benar-benar menghapus data secara permanen, melainkan hanya menandai data tersebut sebagai "terhapus". Di Laravel, fitur ini dikenal sebagai Soft Delete.
Dengan fitur ini, data yang dihapus akan tetap berada di database tetapi ditandai sebagai tidak aktif. Hal ini memungkinkan kita untuk memulihkan data yang dihapus jika diperlukan.
Berikut adalah cara menambahkan kolom soft delete dalam migrasi Laravel:
1. Tambahkan Kolom deleted_at
Pertama, kita perlu menambahkan kolom deleted_at
pada tabel yang ingin kita gunakan soft delete. Kolom ini bertipe timestamp dan akan menyimpan waktu saat data dihapus.
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddDeletedAtToUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropSoftDeletes();
});
}
}
Kode di atas akan menambahkan kolom deleted_at
ke tabel users
. Perhatikan bahwa kita menggunakan $table->softDeletes()
untuk menambahkan kolom dengan tipe timestamp dan default nilai null
.
2. Menggunakan Trait SoftDeletes
Selanjutnya, kita perlu menambahkan trait SoftDeletes
ke model yang terkait dengan tabel tersebut. Trait ini akan menambahkan beberapa metode yang diperlukan untuk mengelola soft delete.
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
// ...
}
Sekarang, model User
sudah memiliki kemampuan untuk melakukan soft delete.
3. Menggunakan Metode delete()
dan restore()
Metode delete()
akan menandai data sebagai terhapus dengan mengisi kolom deleted_at
dengan waktu saat ini. Sementara metode restore()
akan memulihkan data yang telah dihapus dengan mengatur kolom deleted_at
ke null
.
// Menghapus data
$user = User::find(1);
$user->delete();
// Memulihkan data
$user = User::withTrashed()->find(1);
$user->restore();
Metode withTrashed()
digunakan untuk mengambil semua data, termasuk data yang telah dihapus.
4. Querying Data yang Terhapus
Kita juga dapat melakukan query untuk mengambil data yang telah dihapus dengan menggunakan metode onlyTrashed()
, withTrashed()
, dan whereNotNull('deleted_at')
.
// Mengambil data yang terhapus
$deletedUsers = User::onlyTrashed()->get();
// Mengambil semua data (termasuk yang terhapus)
$allUsers = User::withTrashed()->get();
// Mengambil data dengan kolom deleted_at yang tidak null
$deletedUsers = User::whereNotNull('deleted_at')->get();
5. Mengatur Waktu Retensi Data
Secara default, Laravel tidak memiliki batasan waktu retensi untuk data yang dihapus. Kita dapat mengatur waktu retensi data dengan menggunakan metode deletedAtColumn
pada model.
class User extends Model
{
use SoftDeletes;
protected $deletedAtColumn = 'deleted_at';
protected $dates = ['deleted_at', 'deleted_at_retention'];
public function scopeDeletedAtRetention($query, $date)
{
return $query->where('deleted_at_retention', '<=', $date);
}
}
// Menghapus data dengan waktu retensi
$user->deleteAtRetention(now()->addDays(30));
// Mengambil data yang telah melewati waktu retensi
$deletedUsers = User::deletedAtRetention(now())->get();
Dengan cara ini, data yang dihapus akan secara otomatis dihapus permanen setelah melewati waktu retensi yang telah ditentukan.
Kesimpulan
Menambahkan kolom soft delete dalam migrasi Laravel sangat membantu dalam mengelola data yang tidak ingin dihapus secara permanen. Dengan menggunakan fitur ini, kita dapat memulihkan data yang dihapus jika diperlukan dan juga mengatur waktu retensi data yang dihapus.