[Yii Framework] Membuat Custom Otomatis Value ke Database

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… 🙂

45 Responses to [Yii Framework] Membuat Custom Otomatis Value ke Database

  1. 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…

  2. 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..

  3. kiki says:

    kak, kalau misalnya mau nampilin kode auto increment di form bisa ga? jd sebelum di save, nilainya dah tampil duluan di halaman create

  4. kiki says:

    contoh tampilannya kayak gini : 2012-07-14T10:20:23+0700
    kalau mau diedit jd 07-14-2012 10:20:23 gmn caranya yah kak?

  5. 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..

  6. kiki says:

    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

  7. kalo mau nampilin yg auto increment ga bisa dik. Karena auto increment ga slalu nampilin angka “+1” dari yang terakhir..

  8. Restu H says:

    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

  9. 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..

  10. 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 ..

  11. itu berrti ada yang sama kode primary key nya gan.. jadi slalu gagal di entri..

  12. ari says:

    $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?

  13. ari says:

    ga jadi gan udah nemu. cuma pertanyaan kedua itu yg belom 😀

  14. mksd ny kode yang mana mas?

  15. 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…

  16. Aan Arsyad says:

    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.
    🙂

  17. 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..

  18. Mr.D says:

    mau tanya nih gan, kalo script di atas mau kita masukin ke text-nya gimana ya ?
    sorry, beginner ane gan hehe

  19. uyang says:

    kalau otomatis ambil angkanya di depan gimana ya codingnya?

    misalnya : 00001/M/010101/27/13 lalu berikutnya jadi 00002/M/010101/27/13 dan seterusnya

    help please kaa..

  20. cleo62 says:

    kalo setelah nomer urut 10 kok nggak nambah ya?jadi tetep 10 terus?

  21. cleo62 says:

    oh gitu ya gan..tapi ane bikin persis sama punya agan…hehe.oia gan trus ane mau tanya kalo yang

    $newID = (int)substr($last->nilai1,6) + 1;

    itu yang 6 nilai apa ya gan?

  22. mksd nya 6 itu, kita akan menggambil dari huruf ke 6 dan seterusnya..

  23. kanra says:

    gan kalau saya mau pakai function beforesave buat masukin data ke database itu bagaimana yaa kode-nya?
    jadi di model saya sudah ada function hitung untuk menghitung nilai,nah buat masukin ke db dengan function beforesave gimana ya?

  24. Adrianus Bonggakaraeng says:

    gan, kalau kasus saya gini ada 2 tabel A dan B, di tabel A ada id(auto increment), name,… tabel B ada id(auto increment), idA,.. kemudian field “idA” dari tabel B direlasi dengan field “id” dari tabel A. Gimana caranya sehingga seluruh data yang ada dari field “id” tabel A di save secara otomatis di field “idA” tabel B. Mohon bantuannya..

  25. mksd nya di simpan seluruh nya otomatis gimana gan?

  26. Adrianus Bonggakaraeng says:

    Sudah dpat solusinya gan. Saya sedang membuat aplikasi evaluasi student, sekarang dah di bagian multiplechoice…
    viewnya seperti ini..

    <?php for($i = 1;$i

    <?php for($j=1;$j

    <?php echo "$j.“;?>

    Nah, kemudian untuk controllernya:
    ………..
    for($i = 1;$isave();
    endif;
    for($j=1;$jid_soal=$model->id;
    $opsiquiz->opsi=$_POST[‘Opsiquiz’][‘opsi’][$i][$j];
    $opsiquiz->save();
    endif;
    endfor;
    endfor;
    ………
    Jadi untuk mengambil value “id”(auto increment) dari tabel Multiplechoice untuk disave secara otomatis ke field “id_soal” tabel Opsiquiz, seperti: $opsiquiz->id_soal=$model->id.

  27. husen says:

    gan itu editnya dimana ya?

  28. gan, bisakah saat kita mau ng-entry data baru
    yang nilai-1 tadi otamtis tampil dan ngurut otomatis juga.
    trims

  29. dahir says:

    gan adain training buat yii donk… atau kalo ada kumpulan video training yii.. biaya nanti patungan ama member lain… hehe…

  30. alfiyan says:

    kang sy sudah coba tp error gni
    Error 404
    The system is unable to find the requested action “kL01”.
    tu knp ya?
    trus klau sudah “KL010” error nya gni
    CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘kL010’ for key ‘PRIMARY’. The SQL statement executed was: INSERT INTO `level` (`level`, `kode_level`) VALUES (:yp0, :yp1)

  31. gilar says:

    gan kalo mau bikin format id custom gitu bisa ga?

    contoh : ABCD/01/14

    ket:
    – ABCD : nama depan yg diinginkan, kaya yg diatas “sabit”
    – 01 : diambil dari id (auto increment)
    -14 : diambil dari 2 digit terakhir tahun sistem.

    mohon bantuannya gan

    • kalo kamu mau ngambil dari id autoincrement nya ga bisa gan. karena auto increment baru bisa diketahui kalo udah di insert data nya.
      tapi kalo cuma custom itu aja harus nya udah bisa dipahami dari postingan saya di atas.

  32. saya udah coba. tapi setiap data udah 10, saat input ke 11 error
    CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘sabit-10’ for key ‘PRIMARY’. The SQL statement executed was: INSERT INTO `nilai` (`nilai2`, `nilai3`, `nilai1`) VALUES (:yp0, :yp1, :yp2).

    saya tau ini disebabkan PK yang ganda, kesalahan nya dimana kira – kira bang?

  33. gan, saya belum paham ni sama line : parent::beforeValidate();

    saya kira itu yg dimaksud parent adalah nama tabel, jadi saya ubah menjadi Task::beforeValidate();

    Error yg muncul adalah : Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65488 bytes)

    Di database saya menggunakan PK dengan tipe data integer (ukuran default 11) dan tipe auto_increment. yg salah dimana ya gan ? terimakasih sebelumnya.

  34. eko says:

    gimana solusinya jika saya input nilai siswa 90 otomatis terisi di field hurup sembilan puluh ? mohon bantuanya

Leave a reply to Sabit Huraira Cancel reply