Assalamualaikum wr wb, pada kesempatan kali ini saya akan berbagi ilmu mengenai penjelasan dan cara menggunakan before save dan after save di Yii2. Setelah lama tidak update blog karena berbagai kesibukan, kita mulai lagi belajar dari hal hal yang ringan tapi cukup bermanfaat. Kita akan membuat sebuah fungsi di Yii2 yang cara menggunakan nya mirip seperti trigger di Sql, fungsi ini sangat berguna karena berjalan secara paralel pada waktu melakukan proses save atau update data pada model active record. Untuk lebih jelasnya langsung saja kita coba praktekkan cara membuat Before Save dan After Save di Yii2.
Before Save dan After Save di Yii2
Disini saya akan menggunakan tabel dengan struktur seperti di bawah ini.
mysql> desc tb_propinsi; +--------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+----------------+ | propinsi_id | int(11) | NO | PRI | NULL | auto_increment | | nama | varchar(45) | NO | | NULL | | | dalam_negeri | tinyint(4) | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +--------------+-------------+------+-----+---------+----------------+ 5 rows in set (0,00 sec)
Kasus Pertama
Kita buat sebuah CRUD menggunakan GII untuk tabel propinsi tersebut, tapi tanpa ada input untuk created_at dan updated_at dan coba kita lakukan proses insert data.
Maka akan terjadi error seperti berikut karena field created_at dan updated_at saya buat not null dan tidak ada default value pada form inputan.
Solusi
Nah, untuk menyelesaikan masalah di atas kita bisa menggunakan fungsi before save.
Before save adalah proses yang di lakukan sebelum proses save ke model active record terjadi.
Kita buat script seperti pada dokumentasi nya disini, dan ubah scrip pada model TbPropinsi dengan menambahkan script di bawah ini.
public function beforeSave($insert) { if (parent::beforeSave($insert)) { $this->created_at = date('Y-m-d H:i:s'); $this->updated_at = date('Y-m-d H:i:s'); return true; } else { return false; } }
Kemudian coba kita eksekusi lagi proses Insert Data Propinsi. Foilah sukses berjalan tanpa error pada field created at, updated at dan data sudah terisi sesuai before save yang kita definisikan.
Kasus Kedua
Pada kasus kedua ini saya akan mencoba menginsert data secara paralel pada tabel yang lain ketika proses menyimpan data pada tabel propinsi terjadi. Tabel yang saya gunakan adalah tabel kabupaten. Pada form Insert Tabel Propinsi, akan terjadi proses insert ke tabel propinsi dan tabel kabupaten.
mysql> desc tb_kabupaten_kota; +-------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+----------------+ | kab_id | int(11) | NO | PRI | NULL | auto_increment | | nama | varchar(150) | NO | | NULL | | | propinsi_id | int(11) | NO | MUL | NULL | | | kab_kodya | int(11) | YES | | NULL | | +-------------+--------------+------+-----+---------+----------------+
Seperti yang terlihat, ada sebuat field foreign key propinsi id pada tabel tb_kabupaten_kota tersebut, jika ingin melakukan proses paralel insert pada tabel kabupaten, tidak bisa menggunakan berfore save seperti pada kasus pertama. Karena row pada tabel propinsi belum terbentuk dan data untuk foreign key propinsi_id tidak ada. Untuk itulah maka pada kasus ini kita menggunakan fungsi after save.
After save adalah proses yang dilakukan setelah proses save di model Active Record Terjadi.
Langsung saja kita tambahkan script di model TbPropinsi untuk menginsert data secara paralel pada tabel TbKabupatenKota.
public function afterSave($isNew, $old) { if ($isNew){ $kabupaten = new TbKabupatenKota; $kabupaten->propinsi_id = $this->propinsi_id; $kabupaten->nama = "kabupaten dari propinsi ".$this->nama; $kabupaten->kab_kodya = 1; $kabupaten->save(); } }
*fungsi di atas berjalan jika proses insert data baru pada model tbPropinsi di eksekusi.
Uji Coba
Kita coba masukkan data pada Form Create Propinsi.
Kemudian kita lihat data pada tabel kabupaten kota apakah data sudah bisa di insert beserta foreign key dari Tabel Propinsi. Tadaa, data berhasil di insert sesuai dengan fungsi after save yang kita buat tadi 😀 .
Sekian bahasan yang saya sampaikan, semoga dapat bermanfaat. Kritik dan masukkan silahkan sampaikan saja, jangan sungkan sungkan 😀 .
Terimakasih.
referensi dari Yii2 framework