update registros not insert_batch exist evitar duplicados batch mysql codeigniter

mysql - registros - CodeIgniter- registro de inserción activa si es nuevo o actualización por duplicado



update codeigniter (7)

Aquí hay un método que espero pueda lograr lo mismo.

/** * Used to insert new row if a duplicate entry is encounter it performs an update * @param string $table table name as string * @param array $data associative array of data and columns * @return mixed */ private function updateOnExist($table, $data) { $columns = array(); $values = array(); $upd_values = array(); foreach ($data as $key => $val) { $columns[] = $this->db->escape_identifiers($key); $val = $this->db->escape($val); $values[] = $val; $upd_values[] = $key.''=''.$val; } $sql = "INSERT INTO ". $this->db->dbprefix($table) ."(".implode(",", $columns).")values(".implode('', '', $values).")ON DUPLICATE KEY UPDATE".implode(",", $upd_values); return $this->db->query($sql); }

¿Es posible hacer una consulta de registro activo en CodeIgniter que actualizará un registro existente si ya existe uno o insertarlo si no lo hace, para la clave dada?

Entiendo que esto se podría hacer primero consultando para encontrar un registro existente, pero estoy buscando el enfoque más eficiente.


Estoy usando este enfoque:

  1. configure su tabla mytable con unique id y unique clave unique para la column xyz , que desea actualizar

  2. intente insertar una matriz $data , usando INSERT IGNORE INTO para evitar duplicados

    $insert_query = $this->db->insert_string(''bt_ical_list'', $data); $insert_query = str_replace(''INSERT INTO'',''INSERT IGNORE INTO'',$insert_query); $this->db->query($insert_query);

    esto inserta una fila, si el valor en la column xyz no existe

  3. use la función insert_id() para devolver una id si se insertó una fila, actualizar si no se insertó una fila

    if(!$this->db->insert_id()){ $query=$this->db ->where(''xyz'', $data[''xyz'']) ->update(''my_table'',$data); };


La respuesta de Milaza actualizada - Simplemente hecho

$updt_str = ''''; foreach ($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'', $array).'' ON DUPLICATE KEY UPDATE ''.$updt_str);


No sé. Codeigniter Active Record Class tiene este método o no verifica los documentos de codeigniter para los métodos que contienen la clase de registro activa.

Pero se puede lograr esto a través de la extensión de los modelos centrales de codigniter. Al usar esta forma, puede usar este método para todos los modelos que amplían esta clase de modelo. Simplemente coloque el MY_model.php en application / core / y escriba el siguiente código.

Class MY_Model extends CI_Model { public function insert_update($data) { // code for checking existing record. if(//existing record) fire the update query else fire the insert query return insert/update id; } }

después de crear el archivo anterior, debe cambiar la clase principal de Todos sus modelos al nuevo Modelo extendido, por ejemplo, MY_Model

class some_model extends MY_Model

NOTA : Debe seleccionar la clave principal de los resultados y colocarla en la condición where.

Es muy importante, por lo que hago cuando obtengo los datos del controlador, solo compruebo si tengo la identificación o no, si la identificación está presente, y si no, activé la consulta de actualización. De lo contrario, activé la consulta de inserción.

LA MEJOR DE LAS SUERTES


Podrías hacerlo más simple:

$sql = $this->db->insert_string(table, $array) . '' ON DUPLICATE KEY UPDATE '' . implode('', '', $array); $this->db->query($sql);


Si usa Codeigniter 3.0 o superior, puede considerar usar "$ this-> db-> replace ()". Según la guía del usuario:

"Este método ejecuta una instrucción REPLACE, que es básicamente el estándar SQL para DELETE + INSERT (opcional), utilizando las teclas PRIMARIA y ÚNICA como factor determinante. En nuestro caso, le ahorrará la necesidad de implementar lógicas complejas con diferentes combinaciones de llamadas "select (), update (), delete () e insert ()".

En otras palabras,

  • Si no existe, inserta un nuevo registro.
  • Si existe, lo actualiza según su clave principal o única.

Solo úselo directamente de la caja como:

$data = array( ''title'' => ''My title'', ''name'' => ''My Name'', ''date'' => ''My date'' ); $this->db->replace(''table'', $data);

No requiere pilas !!!


Básicamente, lo que está buscando podría ser este INSERT ... ON DUPLICATE KEY UPDATE , siempre que esté usando MySQL y su ID sea una clave única en la tabla.

Tendría que construir manualmente la consulta y pasar a la función $this->db->query() lugar de cualquier registro activo integrado como las funciones de ayuda del controlador de base de datos.

Ejemplo:

$sql = ''INSERT INTO menu_sub (id, name, desc, misc) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE name=VALUES(name), desc=VALUES(desc), misc=VALUES(misc)''; $query = $this->db->query($sql, array( $id, $this->validation->name, $this->validation->desc, $this->validation->misc ));