update_batch update not insert_batch inner batch mysql activerecord codeigniter model

mysql - update - where not in codeigniter



¿Cómo usaría ON DUPLICATE KEY UPDATE en mi modelo de CodeIgniter? (8)

A continuación se muestra un fragmento de código que utilizo cada vez para actualizar en duplicados:

$sql = "insert into table_name (id, name) values(".$id.",''".$name."'') on duplicate key update id=".$id.",name=''".$name."''"; //Executing queries $result = $this->db->query($sql, array($id, $name));

Nota: la id columna debe ser primaria o única

Tengo un modelo CodeIgniter / PHP y quiero insertar algunos datos en la base de datos.

Sin embargo, tengo este conjunto en mi consulta SQL ''sin procesar'':

ON DUPLICATE KEY UPDATE duplicate=duplicate+1

Estoy usando CodeIgniter y estoy convirtiendo todas mis consultas de SQL en el controlador anterior a ActiveRecord . ¿Hay alguna forma de hacerlo desde el modelo basado en ActiveRecord?

¡Gracias!

Jack


El enlace al hilo del foro anterior está roto. No conozco una forma mejor que el simple uso de db-> query para la llamada, si alguien tiene una solución mejor, publíquela.

$result = $this->CI->db->query( "INSERT INTO tablename (id, name, duplicate) VALUES (1, ''Joe'', 1) ". "ON DUPLICATE KEY UPDATE duplicate=duplicate+1");

Espero que esto ayude a alguien que busque una solución a esto.


El siguiente proceso de trabajo para mí en Codeigniter 3.0.6

public function updateOnDuplicate($table, $data ) { if (empty($table) || empty($data)) return false; $duplicate_data = array(); foreach($data AS $key => $value) { $duplicate_data[] = sprintf("%s=''%s''", $key, $value); } $sql = sprintf("%s ON DUPLICATE KEY UPDATE %s", $this->db->insert_string($table, $data), implode('','', $duplicate_data)); $this->db->query($sql); return $this->db->insert_id(); }


Puede agregar la declaración "ON DUPLICATE" sin modificar ningún archivo principal.

$sql = $this->db->insert_string(''table'', $data) . '' ON DUPLICATE KEY UPDATE duplicate=LAST_INSERT_ID(duplicate)''; $this->db->query($sql); $id = $this->db->insert_id();

Espero que ayude a alguien.


Puede ajustar la función de grabación activa con una adición mínima:

DB_driver.php agregar dentro de la clase:

protected $OnlyReturnQuery = false; public function onlyReturnQuery($return = true) { $this->OnlyReturnQuery = $return; }

Consulta la función de búsqueda (... y agregue desde el principio:

if ($this->OnlyReturnQuery) { $this->OnlyReturnQuery = false; return $sql; }

y finalmente en DB_active_rec.php agregar función:

public function insert_or_update($table='''', $data=array()) { $this->onlyReturnQuery(); $this->set($data); $insert = $this->insert($table); $this->onlyReturnQuery(); $this->set($data); $update = $this->update($table); $update = preg_replace(''/UPDATE.*?SET/'','' ON DUPLICATE KEY UPDATE'',$update); return $this->query($insert.$update); }

Ahora puedes usarlo como:

$ this-> db-> insert_or_update (''table'', array $ data);

Pros: utiliza toda la validación de registros activa. Contras: no es la mejor manera (la más adecuada) de extender la función, porque si planeas actualizar estos archivos, tendrás que rehacer el procedimiento.


Siguiendo el fragmento vinculado a Pickett, hice algunas modificaciones a:

1) Actualícelo para usar el nuevo Generador de consultas (CI 3), anteriormente conocido como Registro activo.

2) Ahora puede pasar una matriz asociativa (clave => valor) o una matriz de matrices asociativas. En la segunda forma, realiza una actualización múltiple.

Sólo lo probé con mysqli, y funciona bien.

Este fragmento de código se encuentra en system / database / drivers / mysqli / mysqli_driver.php

function _duplicate_insert($table, $values) { $updatestr = array(); $keystr = array(); $valstr = array(); foreach($values as $key => $val) { $updatestr[] = $key." = ".$val; $keystr[] = $key; $valstr[] = $val; } $sql = "INSERT INTO ".$table." (".implode('', '',$keystr).") "; $sql .= "VALUES (".implode('', '',$valstr).") "; $sql .= "ON DUPLICATE KEY UPDATE ".implode('', '',$updatestr); return $sql; } function _multi_duplicate_insert($table, $values) { $updatestr = array(); $keystr = array(); $valstr = null; $entries = array(); $temp = array_keys($values); $first = $values[$temp[0]]; foreach($first as $key => $val) { $updatestr[] = $key." = VALUES(".$key.")"; $keystr[] = $key; } foreach($values as $entry) { $valstr = array(); foreach($entry as $key => $val) { $valstr[] = $val; } $entries[] = ''(''.implode('', '', $valstr).'')''; } $sql = "INSERT INTO ".$table." (".implode('', '',$keystr).") "; $sql .= "VALUES ".implode('', '',$entries); $sql .= "ON DUPLICATE KEY UPDATE ".implode('', '',$updatestr); return $sql; }

Y esto se incluye en el archivo /system/database/DB_query_builder.php:

function on_duplicate($table = '''', $set = NULL ) { if ( ! is_null($set)) { $this->set($set); } if (count($this->qb_set) == 0) { if ($this->db_debug) { 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]; } $is_multi = false; foreach (array_keys($set) as $k => $v) { if ($k === $v) { $is_multi = true; //is not assoc break; } } if($is_multi) { $sql = $this->_multi_duplicate_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $this->qb_set ); } else { $sql = $this->_duplicate_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $this->qb_set ); } $this->_reset_write(); return $this->query($sql); }

Luego puede hacer esto para una sola fila insertar / actualizar:

$this->db->on_duplicate(''table'', array(''column1'' => ''value'', ''column2'' => ''value''));

O esto para una inserción múltiple / actualización:

$this->db->on_duplicate(''table'', array( array(''column1'' => ''value'', ''column2'' => ''value''), array(''column1'' => ''value'', ''column2'' => ''value'') ));


Usando $this->db->query() y parámetros, así es como lo hago. los primeros 4 parámetros son para la parte de inserción y los tres últimos parámetros se repiten para la parte de on duplicate key update .

$sql = "insert into application_committee ". "(application_id, member1_id, member2_id, member3_id) values (?, ?, ?, ?)". " on duplicate key update member1_id = ?, member2_id = ?, member3_id = ?"; $this->db->query($sql, array($appid, $member_1, $member_2, $member_3, $member_1, $member_2, $member_3);


Simplemente hecho

$updt_str = ''''; foreach ($insert_array as $k => $v) { $updt_str = $updt_str.'' ''.$k.'' = ''.$v.'',''; } $updt_str = substr_replace($updt_str,";", -1); $this->db->query($this->db->insert_string(''table_name'', $insert_array).'' ON DUPLICATE KEY UPDATE ''.$updt_str);