Auto Increment Trigger Oracle Not Work With Yii Framework Active Record

Sebelumnya saya telah memaparkan bagaimana cara membuat sebuah auto increment pada oracle disini. Tetapi setelah di implementasikan langsung dengan menggunakan Yii Framework ternyata trigger tersebut tidak berjalan. Perlu diketahui fungsi ini tidak berjalan ketika menggunakan active record pada Yii. Sedangkan jika anda menggunakan query builder atau DAO ini tidak masalah.  Saya menemukan hal ini dengan menggunakan Yii Framework versi 1.1.13, semoga versi selanjutnya dapat menyelesaikan masalah ini..

Mengapa tidak berjalan ? berikut alur kerja penyimpanannya menggunakan active record :

– kita mendefinisikan model

– memasukkan data

– menyimpan data , pada proses ini seharusnya sesaat sebelum insert data Yii sudah menjalankan trigger yang telah kita buat sebelumnya. Tetapi ternyata dia tidak melakukan hal tersebut melainkan langsung menyimpan dan menyebabkan error. Andaikata kita menyisipkan sebuah nilai pada field auto increment tadi, maka setelah penyimpanan berhasil dilakukan tetapi nilai dari field auto increment akan mengikuti nilai sequence kita.

Untuk mengatasi hal tersebut, maka saya putuskan untuk menghilangkan trigger yang ada pada oracle, dan membuat sendiri fungsi pada Yii yang akan selalu dijalankan sebelum proses insert data baru terjadi. Caranya cukup mudah, cukup sisipkan code beforeValidate pada model anda seperti berikut :

    public function beforeValidate()
    {
        if(Yii::app()->db->driverName=="oci")
        {

            $connection = Yii::app()->db;
            if($this->primaryKey==NULL)
            {            
                $sql = "select nama_sequence_anda.NEXTVAL from DUAL";
                $command = $connection->createCommand($sql);
                $this->primaryKey = $command->queryScalar();

            }
        }
        return parent::beforeValidate();
    }

Fungsi di atas akan selalu dijalankan sebelum data divalidasi. Pada fungsi tersebut dapat anda lihat kita melakukan cek terlebih dahulu apakah database yang dituju adalah oracle atau bukan. Kemudian ketika primary key dari data yang kita input adalah NULL (artinya dia data baru, dan tidak dijalankan untuk fungsi update) maka dia akan mengambil nilai terakhir dari sebuah sequence yang telah kita buat sebelumnya dan menyisipkannya ke dalam nilai primary key..

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: