2010-01-16 8 views
17

Quería actualizar una fila usando registros activos en codeigniter, y solo quiero incrementar el valor de un campo (received_qty = received_qty +1), me di cuenta de que puede hacer que en SQL habitual, pero no puedo en CodeIgniter registros activosAgregar una cláusula a una instrucción MySQL sin comillas usando las funciones Active Record de CodeIgniter

$update['received_qty'] = 'received_qty + 1'; 
$update['received_date'] = date("Y-m-d"); 
$this->db->where($where); 
$this->db->update('vrs_distribution', $update); 

alguien sabe cómo hacerlo usando registros activos?

Respuesta

37

Esto funcionará.

$this->db->set('received_qty', 'received_qty + 1', FALSE); 
$this->db->set('received_date', date("Y-m-d")); 
$this->db->where($where); 
$this->db->update('vrs_distribution'); 

ActiveRecord escapa todo puesto en un conjunto(), where() y muchos otros métodos. Where y set pueden tomar un tercer parámetro opcional de $ escape que es un booleano. Establézcalo en FALSE y CodeIgniter no escapará a nada, lo que significa que su incremento de campo no se tratará como una cadena.

-2

Parece bastante cercano, no hay un comando de 'incremento por uno' en ActiveRecord de CI (o en SQL para el caso).

$update['received_qty']++; 
$update['received_date'] = date("Y-m-d"); 
$this->db->where($where); 
$this->db->update('vrs_distribution', $update); 
+0

Lo siento amigo, pero hay, ActiveRecord simplemente escapa toda la entrada como una cadena a menos que se indique lo contrario. –

+0

Debió haber llegado tarde, o llegué al bar temprano. Whoops. – Zack

2

O puede hacer:

$this->db->query('UPDATE vrs_distribution SET received_qty = received_qty + 1, received_date = CURDATE() WHERE id = ' . $id); 

Usted tendría que modificar la cláusula WHERE para adaptarse a usted, aunque

0

estado se establece en cero (Actualización)

$this->db->set('IsCurrent', '0');  
$this->db->where('AcademicYearID',$academicYearId); 
$this->db->update('academicyear'); 
0

que iba a hacer una pregunta similar sólo un poco diferente, pero el problema era el mismo: que necesitaba para actualizar una cita con un intervalo (expiry_date = expiry_date + interval 3 month) y Phil Sturgeon's answer resolvió el problema.

Sin embargo, lo que me di cuenta es que todavía se puede utilizar la matriz para los campos que pueden tener las cotizaciones, lo que significa que se podría escribir:

$this->db->set('received_qty', 'received_qty + 1', FALSE); 
$this->db->set('expired_date', 'CURDATE() + INTERVAL 10 DAY', FALSE); //extra example 1 
$update['received_date'] = date("Y-m-d"); 
$update['receiver'] = $receiver_name; //extra example 2 
$this->db->where($where); 
$this->db->update('vrs_distribution', $update); 

Dónde $this->db->last_query() seria:

UPDATE `vrs_distribution` 
    SET `received_qty` = received_qty + 1, 
     `expiry_date` = CURDATE() + INTERVAL 10 DAY, #extra example 1 
     `received_date` = '2015-07-01 16:00:00', 
     `receiver` = 'strike_noir', #extra example 2 
    WHERE #where clause with backticks 

Observe que los campos donde se usó set() no tienen citas y aparecen en primer lugar. El resto de la consulta tiene retrocesos (dejando "CodeIgniter protect the remaining fields").

Cuestiones relacionadas