Pada pembahasan sebelumnya tentang Dumping Data Dari Database Lain Dengan CodeIgniter, pada file model terdapat perintah insert_on_duplicate_update_batch. Perintah ini digunakan utnuk melakukan proses insert data ke dalam tabel, jika terdapat primary key yang sama lakukan update field.
Perintah query tersebut harus kita definisikan terlebih dahulu karena dalam CodeIgniter belum memfasilitasi perintah tersebut.
Bagaimana cara untuk menambahkan perintah query tersebut, dapat kita lakukan dengan cara sebagai berikut:
- Masuk ke dalam folder system/database kemudian edit DB_query_builder.php, tambahkan sintaks fungsi berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/** * Insert_On_Duplicate_Update_Batch * * Compiles batch insert strings and runs the queries * MODIFIED to do a MySQL 'ON DUPLICATE KEY UPDATE' * * @access public * @param string the table to retrieve the results from * @param array an associative array of insert values * @return object */ function insert_on_duplicate_update_batch($table = '', $set = NULL) { if (!is_null($set)) { $this->set_insert_batch($set); } if (count($this->qb_set) == 0) { if ($this->db_debug) { //No valid data array. Folds in cases where keys and values did not match up return $this->display_error('db_must_use_set'); } return FALSE; } if ($table == '') { if (!isset($this->qb_from[0])) { if ($this->db_debug) { return $this->display_error('db_must_set_table'); } return FALSE; } $table = $this->qb_from[0]; } // Batch for ($i = 0, $total = count($this->qb_set); $i < $total; $i = $i + 1000) { $sql = $this->_insert_on_duplicate_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, 1000)); // echo $sql; $this->query($sql); } $this->_reset_write(); return TRUE; } |
- Masuk ke dalam folder system/database/drivers/mysqli edit pada file mysqli_driver.php dengan menambahkan fungsi sebagai berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/** * Insert_on_duplicate_update_batch statement * * Generates a platform-specific insert string from the supplied data * MODIFIED to include ON DUPLICATE UPDATE * * @access public * @param string the table name * @param array the insert keys * @param array the insert values * @return string */ function _insert_on_duplicate_update_batch($table, $keys, $values) { foreach ($keys as $key) $update_fields[] = $key . '=VALUES(' . $key . ')'; return "INSERT INTO " . $table . " (" . implode(', ', $keys) . ") VALUES " . implode(', ', $values) . " ON DUPLICATE KEY UPDATE " . implode(', ', $update_fields); } |
Dengan menambahkan fungsi query builder ini, maka CodeIgniter sudah dapat melakukan perintah insert on duplicate key update batch dengan cara memanggil pada model dengan sintaks berikut.
1 |
$this->db->insert_on_duplicate_update_batch($table, $data); |
Semoga bermanfaat.
can it be used for multidimensional arrays?
Bisa diberikan contoh konsepnya seperti apa?