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:
configure su tabla
mytable
conunique id
yunique
claveunique
para lacolumn xyz
, que desea actualizarintente insertar una matriz
$data
, usandoINSERT 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 existeuse la función
insert_id()
para devolver unaid
si se insertó una fila, actualizar si no se insertó una filaif(!$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
));