Bosan dengan kekacauan data yang tak terkelola di database Anda? Laravel Pruning adalah solusi yang Anda cari! Pelajari cara mengautomasi proses pemangkasan data yang tidak lagi diperlukan dengan panduan lengkap ini.
8 min read·18 Aug 2023
Laravel Pruning adalah fitur yang memungkinkan kita untuk secara berkala menghapus data yang tidak lagi dibutuhkan. Fitur ini berguna untuk menjaga database tetap ringkas dan efisien. Dalam artikel ini, kita akan memahami cara menggunakan Prunable
dan MassPrunable
untuk melakukannya.
Pruning dalam konteks Laravel berarti proses penghapusan data yang sudah tidak diperlukan lagi dari database. Ini dapat melibatkan penghapusan data/record yang sudah kadaluarsa, tidak valid, atau memenuhi kondisi tertentu yang ditetapkan oleh pengembang.
Seiring waktu, database dapat tumbuh dengan data yang sudah tidak diperlukan lagi. Hal ini dapat mengurangi kinerja dan efisiensi aplikasi. Pruning membantu dalam menghapus data ini, menjaga ukuran database tetap terkendali.
Laravel menyediakan dua trait khusus untuk mendukung pruning:
pruning
untuk menangani logika tambahan sebelum model dihapus.Mari kita buat contoh nyata untuk Laravel Pruning dengan skenario menghapus pengguna yang belum diverifikasi dalam 7 hari terakhir. Ini akan menggunakan field email_verified_at
dalam model User
.
Karena Laravel sendiri telah memberikan kita UserFactory by default, maka kita bisa menggunakannya untuk membuat dummy data.
Pertama sekali, silakan buka terminal Anda untuk membuat user seeder seperti:
php artisan make:seeder UserSeeder
Setelah itu, silakan buka file nya dan modifikasi seperti berikut ini:
use App\Models\User;
public function run(): void
{
User::factory()->count(10)->create([
'created_at' => now()->subWeeks(rand(3,5)),
]);
User::factory()->unverified()->count(10)->create([
'created_at' => now()->subWeeks(rand(3,5)),
]);
}
Setelah itu, silakan buka kembali terminal Anda dan jalankan perintah berikut:
php artisan db:seed --class=UserSeeder
Dengan begitu, maka sekarang kita akan mempuyai 20 user yang mana 10 sudah verifikasi dan 10 nya lagi belum. Ingat, bahwa verifikasi di sini akan dipicu dari field email_verified_at
yang ada pada migrasi users.
Karena kita sedang bekerja dengan user, maka kita perlu menambahkan 1 trait kepada modelnya dengan nama Prunable
seperti berikut:
+ use Illuminate\Database\Eloquent\Prunable;
class User extends Authenticatable
{
+ use Prunable;
use HasApiTokens;
use HasFactory;
use Notifiable;
Maka sekarang kita bisa menambahkan method prunable
tepat pada model ini juga.
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Prunable;
class User extends Model
{
use Prunable;
/**
* Get the prunable model query.
*/
public function prunable(): Builder
{
return static::whereNull('email_verified_at')
->where('created_at', '<=', now()->subDays(7));
}
}
Setelah semua di lakukan, maka sekarang Anda bisa langsung membuka terminal dan jalankan perintah:
php artisan model:prune --pretend
Perintah di atas akan memberikan output berapa jumlah data yang perlu dipangkas seperti:
INFO 10 [App\Models\User] records will be pruned.
Dan jika kita ingin menjalankan prune nya, maka silakan hilangkan --pretend
seperti:
php artisan model:prune
Dengan begitu, maka semua record akan terhapus di dalam database kecuali yang sudah verifikasi.
INFO Pruning [App\Models\User] records.
App\Models\User ............................10 records
Laravel Pruning mempengaruhi model yang menggunakan soft delete. Jika model Anda menggunakan trait SoftDeletes
dan terpenuhi kriteria yang ditetapkan dalam metode prunable
, maka model tersebut akan dihapus secara permanen menggunakan metode forceDelete
.
Jadi jika model User
Anda juga menggunakan trait SoftDeletes
, dan Anda menerapkan Pruning pada model tersebut, pengguna yang cocok dengan kriteria pruning akan dihapus secara permanen dari database, bahkan jika mereka telah di "soft delete".
Ini adalah hal yang perlu diperhatikan saat menggunakan pruning dengan model yang menggunakan soft delete, karena dapat mengakibatkan penghapusan data yang tidak dapat dikembalikan.
Berikut adalah contoh bagaimana Anda mungkin ingin memodifikasi metode prunable
jika Anda ingin memangkas pengguna yang belum diverifikasi dalam 7 hari terakhir dan telah masuk dalam daftar "soft delete":
public function prunable(): Builder
{
return static::onlyTrashed()
->whereNull('email_verified_at')
->where('created_at', '<=', now()->subDays(7));
}
Metode onlyTrashed
akan memastikan bahwa hanya pengguna yang telah di-soft delete (yaitu, mereka yang memiliki nilai non-null dalam kolom deleted_at
) yang akan dipertimbangkan untuk dihapus.
MassPrunable dalam Laravel digunakan saat Anda ingin menghapus sejumlah besar model dari database secara lebih efisien dibandingkan dengan penggunaan prunable biasa. Berikut adalah beberapa situasi di mana Anda mungkin ingin menggunakan MassPrunable:
MassPrunable
akan memungkinkan penghapusan massal dalam satu query, daripada menghapus setiap model satu per satu.MassPrunable
lebih efisien karena tidak memuat model ke memori sebelum menghapusnya. Hal ini berarti bahwa metode deleting
dan deleted
, serta metode pruning
pada model, tidak akan dipanggil. Ini memungkinkan operasi penghapusan menjadi lebih cepat.deleting
atau deleted
), MassPrunable
adalah pilihan yang baik karena akan mengabaikan event-event tersebut.Berikut adalah contoh bagaimana Anda bisa menggunakan trait MassPrunable
pada model User
Anda:
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\MassPrunable;
class User extends Model
{
use MassPrunable;
public function prunable(): Builder
{
return static::whereNull('email_verified_at')
->where('created_at', '<=', now()->subDays(7));
}
}
Peringatan
Meskipun MassPrunable
lebih efisien, perlu diingat bahwa karena model tidak dimuat sebelum penghapusan, Anda tidak dapat menjalankan logika khusus pada model sebelum penghapusan. Jadi, jika Anda perlu menjalankan kode sebelum menghapus model, Anda mungkin akan lebih memilih menggunakan Prunable
biasa.
Secara keseluruhan, penggunaan MassPrunable
cocok untuk situasi di mana Anda perlu memangkas banyak data dengan cepat dan efisien, tanpa perlu menjalankan logika tambahan sebelum atau setelah penghapusan.
prune() == pruning()
?Tentu tidak, karena prune()
dan pruning()
bukanlah metode yang sama dalam konteks Laravel Pruning.
prune()
adalah metode yang melakukan pemangkasan itu sendiri, sementara pruning()
adalah metode yang Anda gunakan untuk menentukan apa yang harus terjadi sebelum model dipangkas.
Metode pruning
dalam Laravel digunakan dalam situasi di mana Anda perlu menjalankan logika khusus sebelum model dipangkas. Dengan menambahkan metode pruning
ke model Anda, Anda bisa menentukan tindakan kustom yang harus diambil sebelum model tersebut dihapus dari database.
Berikut adalah beberapa situasi di mana Anda mungkin ingin menggunakan metode pruning
:
pruning
untuk memastikan file-file tersebut dihapus sebelum model dipangkas.pruning
memungkinkan Anda menambahkan kode untuk melogging detail yang relevan sebelum penghapusan.pruning
untuk mengirim pemberitahuan tersebut.Misalkan Anda memiliki model User
, dan sebelum memangkas pengguna, Anda ingin menghapus avatar yang terkait dengan pengguna tersebut dari penyimpanan. Anda bisa melakukannya dengan metode pruning
:
class User extends Model
{
use Prunable;
protected function pruning(): void
{
Storage::delete($this->avatar_path);
}
public function prunable(): Builder
{
return static::where('last_active_at', '<=', now()->subYears(1));
}
}
Dalam contoh ini, metode pruning
memastikan bahwa file avatar dihapus dari penyimpanan sebelum model pengguna dipangkas.
FYI
Penting untuk diingat bahwa metode pruning
hanya bekerja dengan trait Prunable
dan tidak dengan MassPrunable
, karena MassPrunable
menghapus data secara massal tanpa memuat model terlebih dahulu, sehingga metode seperti pruning
tidak akan dipanggil.
Situasi-situasi seperti ini membuat metode pruning
menjadi alat yang berguna saat Anda perlu mengelola aspek-aspek tambahan dari model yang akan dipangkas, selain hanya penghapusan dari database.
Karena Laravel dilengkapi dengan alat penjadwalan yang fleksibel dan kuat, kita dapat dengan mudah menjadwalkan tugas-tugas berulang seperti pemangkasan data.
Proses pemangkasan memungkinkan kita untuk membersihkan data yang tidak lagi diperlukan dari database kita, menjaga sistem tetap ringan dan efisien.
Pertama, silakan buka file yang ada di app\Console\Kernel.php
, dan silakan masukkan schedule nya seperti:
protected function schedule(Schedule $schedule): void
{
$schedule->command('model:prune')->daily();
}
Untuk melihat jadwal ini bekerja, cukup jalankan perintah berikut di terminal:
php artisan schedule:work
FYI
Jika Anda tidak mengetahui banyak tentang laravel schedule, bisa langsung melihat nya disini Laravel Task Scheduling.
Selamat mencoba, dan semoga berhasil. Saya Irsyad dan sampai jumpa di artikel selanjutnya.
Dengan menambahkan beberapa baris kode dalam model dan menjadwalkan tugas dengan Scheduler Laravel, kita dapat secara otomatis membersihkan data tersebut berdasarkan kriteria yang kita tentukan.
Kita juga memiliki fleksibilitas untuk melakukan pemangkasan massal yang lebih efisien dengan MassPrunable
atau menambahkan logika kustom sebelum pemangkasan dengan metode pruning()
.
Laravel sekali lagi menunjukkan kekuatannya dalam menyederhanakan tugas-tugas yang rumit, memungkinkan pengembang seperti kita di parsinta untuk fokus pada hal-hal yang benar-benar penting dalam pengembangan aplikasi.
Bergabunglah dengan 23.000+ lainnya dan jangan pernah ketinggalan screencast, tips, tutorial, dan lainnya.
Baca artikel lain yang mungkin menarik untuk Anda. Atau, Anda bisa mencari artikel lainnya di halaman artikel.