[Yii Framework] Membuat Custom Otomatis Value ke Database
May 5, 2012 18 Comments
Banyak kasus dan pertanyaan dari orang -orang tentang membuat nilai yang otomatis diinput ke dalam database tapi dengan mengikuti aturan bisnis yang dimiliki. Misal pada suatu tabel, kita ingin sebuah field tidak perlu kita input melainkan secara otomatis kode tersebut akan bernama “KD-001″,”KD-002″,”KD-003″ dan seterusnya.. Secara logika yang perlu kita lakukan adalah mengetahui terlebih dahulu nilai terkahir yang ada pada database misal “3″ lalu nilai kita saat ini tinggal menginput 3+1 yaitu 4. Okeh, mari kita bahas..
Misal saya memiliki sebuah tabel yang terdiri dari 3 buah field “nilai1″,”nilai2″,”nilai3″. Kita ingin field “nilai1″ tidak diinput melainkan secara otomatis diisi ketika kita menginput sebuah nilai ke dalam database. Saya asumsikan nilai yang diinput ke dalam field nilai1 adalah “sabit-1″,”sabit-2″, “sabit-3″ dan seterusnya.. Pokok nya di depannya ada kata “sabit-” dan diikuti angka terakhir sesuai dengan yang sudah ada di dababase. Untuk melakukan ini, kita bisa menggunakan event trigger yang ada pada Yii Framework seperti beforeSave atau beforeValidate. Disini saya akan gunakan fungsi beforeValidate dan didefinisikan di model seperti berikut :
protected function beforeValidate()
{
parent::beforeValidate();
$date = new DateTime();
if($this->isNewRecord)
{
$criteria=new CDbCriteria; //kita menggunakan criteria untuk mengetahui nomor terakhir dari database
$criteria->select = 'nilai1'; //yang ingin kita lihat adalah field "nilai1"
$criteria->limit=1; // kita hanya mengambil 1 buah nilai terakhir
$criteria->order='nilai1 DESC'; //yang dimbil nilai terakhir
$last = $this->find($criteria);
if($last) // jika ternyata ada nilai dalam data tersebut maka nilai nya saat ini tinggal di tambah 1 dari data sebelumya
{
$newID = (int)substr($last->nilai1,6) + 1;
$newID = 'sabit-'.$newID;
}
else //jika ternyata pada tabel terebut masih kosong, maka akan di input otomatis nilai "sabit-1" karena memang belum ada sebelumnya nilai lain
{
$newID = 'sabit-1';
}
$this->nilai1=$newID; // nilai1 di set nilai yang sudah di dapat tadi
}
return true;
}
Penjelasa : fungsi di atas menggunakan beforeValidate. Dengan adanya beforeValidate, berarti setiap sebelum melakukan validasi saat akan menyimpan data maka akan dijalankan fungsi ini. Jadi ketika anda menginput sebuah data, maka tanpa diketahui oleh user, kita memasukkan nilai pada field “nilai1″ secara otomatis…
Selesai.. Selamat mencoba..
Semoga membantu…



kk aq bingung n’ gag ngerti buat apa yg ini:
(1) => $date = new DateTime();
(2) => (int)substr($last->nilai1,6) + 1;
yg (1) itu d perluin apa engga?
yg (2) angka 6 itu buat apa?
thanks kalo d blz…
oh iya, yang pertama ga diperluin emang mbak.. saya lupa hapus..
angka 6 kita pake karena kita mau ngambil angka yang ada pada id terakhir tapi angkanya aja yang mau di ambil..
kak, kalau misalnya mau nampilin kode auto increment di form bisa ga? jd sebelum di save, nilainya dah tampil duluan di halaman create
contoh tampilannya kayak gini : 2012-07-14T10:20:23+0700
kalau mau diedit jd 07-14-2012 10:20:23 gmn caranya yah kak?
kode auto increment itu baru ada setelah kita save data nya dik.. jadi kalo kita belum save, kita juga ga tau kode auto increment yang akan di hasilkan apa dik..
kira2 bisa disiasati pake function bs ga ka?
oya, yg comment ttg tanggal itu nyasar, harusnya aku comment di postingan “[Yii Framework] Get Local Time”. maap yah kak.. hehe
kalo mau nampilin yg auto increment ga bisa dik. Karena auto increment ga slalu nampilin angka “+1″ dari yang terakhir..
gan saya masih baru pake yii framework ,,
saya mau tanya ,
kalau misalnya mau nampilin kode auto increment di form bisa ga? jd sebelum di save, nilainya dah tampil duluan di halaman create ,,
kasih pencerahan dong
makasih
kalo mau nampilin ga bisa mbak.. cz auto increment itu sendri tercipta setelah di create.. tapi bisa buat fungsi yang nangkep angka terakhir nya aja.. ntar tinggal di tambahin 1 angka tersebut..
ka , ko kalo kode’a udah sampe ke 10 (kd10) setiap ngeinput lg yg selanjut’a muncul ky gini
“CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘KD10′ for key ‘PRIMARY’. The SQL statement executed was: INSERT INTO `divisi` (`kdDivisi`, `Divisi`, `id_manager`) VALUES (:yp0, :yp1, :yp2)”
dimana yg salah ..?
mkasih ka sebelum’a ..
itu berrti ada yang sama kode primary key nya gan.. jadi slalu gagal di entri..
$newID = ‘sabit-1′; <— dibagian ini kan diganti jadi 'In-00001';
trus pas proses ke dua ga jadi 'In-00002' tapi jadi In-2. itu kenapa ya?
oiya biar kodenya langsung ada pas form muncul gimana?
ga jadi gan udah nemu. cuma pertanyaan kedua itu yg belom
mksd ny kode yang mana mas?
Sorry. itu maksudnya autonumbernya langsung ke set begitu form load, jadi ga nunggu validasi dulu
agan tarik nilai nya jangan ketika nyimpen gan.. jadi nilai nya udah di seti sebelum di simpen nilai nya.. jadi bisa langsung nampil di tampilannya…
agan,
ane nyoba script di atas.
trus ketemu error
CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘nilai1′ in ‘field list’. The SQL statement executed was: SELECT nilai1 FROM `urutan` `t` ORDER BY nilai1 DESC LIMIT 1
mohon pencerahannya.
itu query agan yang salah gan.. itu pesennya udah jelas dia ga bisa nemuin field nilai1
Kunjungi Juga Farifam.com untuk tutorial dan forum Yii Framework yang direspon lebih cepat dari di blog ini..