cek sebelum insert

gan ane ada masalah nih…

langsung aja. punya 1 tabel misalkan seperti ini.

| id | value |


| 1 | 100 |

| 2 | 500 |

nah trus saya ingin menambahkan data menggunakan batch menu kaya gini

setelah saya pilih data yang ingin ditambahkan, saya klik tambah.

misalkan saya dapet id 1 dengan value 100,200,300.

kan kalo saya pake query insert biasa nanti nilai id 1 dengan value 100 itu jadi ada dua.

saya inginnya sebelum di insert ke dalam tabel di cek terlebih dahulu, kalo data dengan id yang sama sudah ada, bisa di lewat/update kalo belum ada langsung di insert.

hasil setelah di insert yang di harapkan seperti ini

| id | value |


| 1 | 100 |

| 1 | 200 |

| 1 | 300 |

| 2 | 500 |

walo saya baru belajar yii, saya ngambil dr contoh contact form mungkin bisa pake cara gini

  1. buat crud pake gii seperti biasa.

  2. buat model class meng-extend CFormModel karena model ini tidak berhubungan dengan database




class NamaModel extends CFormModel {


// buat attribute

	public $id;

	public $value;


// buat rules jika perlu

// buat method attributeLabels


}



  1. buat actionInsert di controller



public function actionInsert() {


    // lakukan pengecekan disini, 

    // jika true lakukan insert

        $model = new NamaModel;

        if (isset($_POST['NamaModel'])) {

            if ($model->validate()) {

                $model->id = 'idnya';

                $model->value = 'nilainya';

                $model->save();

            }

        }

    }



  1. buat view seperti contoh contact form

saya ga tau apa cara ini efektif :lol: , mungkin agan2 master punya cara lain

terima kasih nih gan masukannya. tapi saya ingin sekali klik tombol add, langsung 3 data dimasukan, walaupun bisa pake perulangan for, tapi nanti data yang di database ada value dengan id yang sama

id nya bukan primary key ya gan?.

PRIMARY KEY 2 FIELD

bisa gan,kedua field di jadikan primary key,jadi di field id bisa sama,maksud nya yang jd primari key kedua field,tapi id jangan di auto increment

kalau keduanya di buat primary key,

tetap tidak bisa dipaksakan masuk ke database,

misalnya key 1 - 100 sudah ada sebelumnya, ketika di insert data yang sama pasti error

karena duplicate primary key akan ditolak oleh MySQL.

ada beberapa solusi untuk menanganinya:

PERTAMA :

membuat fungsi beforeSave() di model-nya, yang akan dieksekusi sebelum perintah save() model. misalnya:




public function beforeSave()

{

    // periksa tabel dengan PK yg sama dengan yg akan ditulis

    $model = self::findByPk(array($this->field1, $this->field2));

    if ($model)

         return false // gak jadi save karena datanya sudah ada

    else

         return true // data dengan PK yg sama belum ada, maka OK untuk save




}



KEDUA :

ada pula pendekatan menggunakan validasi di rules modelnya. kita bisa menambahkan fungsi validasi baru untuk memeriksa apakah input yang diberikan memenuhi syarat validasi atau tidak.

misalnya di model-nya:




public function rules()

{

   return array(

       array('field1, field2' , 'cekPK'),

       .... rules2 lainnya sesuai default dari model tabelnya  

   );

}


// tambahkan juga fungsi ini di model

public function cekPK()

{


    $model = self::findByPk(array($this->field1, $this->field2));

    if ($model)

         $this->addError('field1', 'Data sudah ada') // validasi model gagal sehingga perintah save() akan dibatalkan.


}



untuk metode ini, pastikan di controllernya, sebelum menyimpan data, juragan validasi dulu modelnya dengan perintah




if ($model->validate())

     $model->save();



metode ini bisa juga diterapkan di model Form, dengan perbedaan fungsi findByPk() tentu mengarah ke model table kamu.

KETIGA :

cara berikutnya sedikit lebih ‘kasar’ yaitu menyuntikkan langsung query mysql dengan perintah “INSERT IGNORE…”, dengan perintah INSERT IGNORE, apabila primary key yg sama ditemukan, maka datanya tidak ditambahkan ke dalam tabel oleh MySQL

info tentang mysql syntax squery nya cek disini:

Mysql INSERT IGNORE

nah jadi metodenya adalah di Model Form nya kita buatkan fungsi $form->save() yang terdapat fungsi untuk menyimpan data dengan inject langsung query mysql. misalnya:




// file Form Model;


public function save()

{

      $query = "INSERT IGNORE INTO table_name (field1, field2) VALUES ($this->field1, $this->field2)";


      $connection=Yii::app()->db;

      $command=$connection->createCommand($query);

      $execute=$command->execute();


      return;

}



bila datanya banyak, maka silahkan dibuatkan foreach untuk tiap input-nya.

Semoga bisa membantu…

SUKSES SELALU… ::)

terima kasih semua atas jawabannya…

saya coba dulu…

terima kasih gan @xtremagix, sy jg bru belajar n ketemu ksus beginian di yii, akhirnya dpt jg solusinya, thanks

gan ini bisa buat mencegah redundance data ?