Membuat Created_by dan Updated_by terisi otomatis dengan eloquent event – Haloo semuanya Assalaamualaikum wr wb..
Salah satu kesempurnaan dari sebuah aplikasi yaitu terdapat fitur audit log pada setiap action nya..
Salah satu contoh sederhana dari fitur audit log yang wajib kita terapkan yaitu dengan menambahkan kolom created_by dan updated_by pada setiap table master maupun table transaksi..
Dengan ada nya created_by maka kita bisa mengetahui data tersebut dibuat oleh user siapa, dan dengan ada nya updated_by kita bisa mengetahui data tersebut di update oleh siapa..
Mengisi nilai created_by dan updated_by
Sekarang anggap saja kita memiliki sebuah table dengan struktur seperti berikut:
Diatas adalah contoh table master locations yang memiliki field created_by dan juga updated_by..
Dengan cara konvensional sebetulnya kita bisa mengisi nilai untuk kolom created_by / updated_by pada saat melakukan query insert data atau update data..
Sebagai contoh, saat insert data:
.... Location::create([ 'name' => $this->name, 'telp' => $this->telp, 'is_active' => 1, 'created_by'=>Auth::id(), 'updated_by'=>Auth::id() ]); ....
Pada query diatas, kita memberikan sendiri nilai untuk kolom created_by dan updated_by dengan mengambil ID dari user yang sedang login..
Tentu saja cara tersebut memiliki kelemahan / kekurangan serta sangat tidak efektif untuk digunakan, apa saja kekurangan nya?
- Masih men-define dengan cara manual..
- Karena di de-fine dengan cara manual, terkadang si development nya lupa memasukkan nilai untuk kolom created_by dan updated_by nya..
- Tidak efektif karena kita akan sering menulis query yang sama berulang-ulang..
Dengan beberapa kelemahan diatas, maka sudah sepatutnya kita tidak menggunakan cara tersebut lagi..
Lantas bagaimana cara yang efektif?
Menggunakan Eloquent Events Untuk pengisian nilai created_by dan updated_by secara otomatis..
Nah untuk cara efektif nya, kalian bisa menggunakan eloquent event..
Sebagai catatan, cara ini akan berjalan pada laravel versi 7/8/9.. jika versi laravel nya dibawah 7, maka kalian perlu membuat file observer seperti yang dibahas pada akhir sub artikel ini..
Jadi dengan eloquent event, pada saat kita create data atau update data, kita bisa memasukkan sesuatu aksi kedalam nya..
Kita hanya perlu melakukan modifikasi di bagian model nya saja, contoh nya adalah seperti berikut:
<?php namespace App\Models; use App\Models\_LocationRelations; use Illuminate\Support\Facades\Auth; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; class Location extends Model { use HasFactory, _LocationRelations, _LocationScopes, _LocationAsesors; protected $guarded = ['id']; protected $appends = ['jenis', 'photo_faskes_url', 'logo_faskes_url']; protected static function booted() { static::creating(function ($model) { $model->created_by = Auth::id(); $model->updated_by = Auth::id(); }); static::saving(function ($model) { $model->updated_by = Auth::id(); }); } }
Kalian bisa perhatikan script diatas..
Pada baris ke-19 kita memanggil method booted, method tersebut sebetulnya sama seperti __construct, jadi method yang pertama kali di akses ketika kita memanggil model tersebut..
Baca juga : save file from external url to laravel public di rectory
Pada baris ke-21 didalam method booted nya, kita memanggil event creating..
Event creating ini artinya ketika kita memanggil query insert/create data dengan model tersebut, maka kita juga akan melakukan update nilai terhadap kolom created_by dan updated_by nya..
Sementara pada baris ke-26, kita memanggil method saving, method saving ini akan ke-trigger ketika kita melakukan penyimpanan data terhadap model tersebut, salah satunya yaitu ketika kita update data, maka secara otomatis juga akan menupdate nilai dari kolom updated_by..
Maka didalam query insert/create data nya, kita tidak perlu lagi mendefine nilai untuk kolom created_by dan updated_by nya secara manual lagi.. karena 2 kolom tersebut akan terisi nilai nya secara otomatis..
Contoh query create data:
.... Location::create([ 'name' => $this->name, 'telp' => $this->telp, 'is_active' => 1, ]); ....
Contoh query create data diatas, kita tidak mendefine untuk kolom created_by dan updated_by nya..
Tapi kalo kalian cek di database nya, kolom created_by dan updated_by nya ikut terisi..
Begitu juga dengan query update data nya:
.... Location::find($this->id_edit)->update([ 'name' => $this->name, 'telp' => $this->telp, 'is_active' => 1, ]); ....
Note – Sedikit Catatan
Sedikit catatan, contoh diatas dijalankan dengan laravel versi 8..
Kalo kalian menggunakan laravel versi 9 / 8 / 7.. caranya masih sama seperti diatas..
Observer
Tapi kalo kalian menggunakan laravel versi 6 kebawah.. kalian perlu membuat nya dengan menggunakan observer..
kalian tinggal jalankan perintah berikut:
php artisan make:observer UserObserver --model=User
Maka nanti akan tercipta file baru didalam folder “../app/Observers”.. Isi file nya adalah seperti berikut:
<?php namespace App\Observers; use App\User; class UserObserver { /** * Handle the User "created" event. * * @param \App\User $user * @return void */ public function created(User $user) { $user->created_by = Auth::id(); $user->updated_by = Auth::id(); } /** * Handle the User "updated" event. * * @param \App\User $user * @return void */ public function updated(User $user) { $user->updated_by = Auth::id(); } /** * Handle the User "deleted" event. * * @param \App\User $user * @return void */ public function deleted(User $user) { // } /** * Handle the User "forceDeleted" event. * * @param \App\User $user * @return void */ public function forceDeleted(User $user) { // } }
Kemudian kalian perlu mendaftarkan file observer tersebut kedalam AppServiceProvider seperti berikut:
<?php namespace App\Providers; use App\Observers\UserObserver; use App\User; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { User::observe(UserObserver::class); } }
Sekian, semoga bermanfaat.. Terima Kasih..
Support Us
Jika artikel ini bermanfaat untuk kamu, membantu menyelesaikan masalah yang sedang kamu hadapi, kamu juga bisa dukung kami dengan mengunjungi halaman berikut: https://saweria.co/sangcahayaid
Terima kasih..
[…] Sebelumnya kita juga sudah pernah membahas tentang salah satu contoh sederhana audit log yaitu membuat created_by dan updated_by pada setiap table master ataupun transaksi, silahkan buka: Membuat Created_by dan Updated_by terisi otomatis dengan eloquent event.. […]