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…