2010-01-16 10 views
17

Desidero aggiornare una riga utilizzando i record attivi in ​​codeigniter e desidero solo incrementare un valore di campo (received_qty = received_qty +1), mi sono reso conto che può farlo nel consueto di sql, ma non posso in codeigniter record attiviAggiungere una clausola a un'istruzione MySQL senza virgolette utilizzando le funzioni di registrazione attiva di CodeIgniter

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

qualcuno sa come farlo utilizzando record attivi?

risposta

37

Questo funzionerà.

$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 fugge tutto messo in un set(), dove() e molti altri metodi. Dove e set possono entrambi prendere un terzo parametro opzionale di $ escape, che è un valore booleano. Impostalo su FALSE e CodeIgniter non sfuggirà a nulla, il che significa che il tuo incremento di campo non sarà trattato come una stringa.

-2

Sembra abbastanza vicino, non c'è un comando "incrementa di uno" in ActiveRecord di CI (o in SQL per quella materia).

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

Scusate amico ma, ActiveRecord scappa semplicemente tutti gli input come stringa, a meno che non venga indicato diversamente. –

+0

Doveva essere in ritardo, o ho colpito il bar presto. Ops. – Zack

2

Oppure si può fare:

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

Si avrebbe bisogno di modificare la clausola WHERE che fa per te se

0

stato impostato a zero (Aggiornamento)

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

Stavo per fare una domanda simile solo un po 'diverso, ma il problema era la stessa: avevo bisogno di aggiornare un appuntamento con un intervallo (expiry_date = expiry_date + interval 3 month) e Phil Sturgeon's answer ha risolto il problema.

Tuttavia, ciò che ho capito è che si può ancora utilizzare la matrice per i campi che possono avere le citazioni, il che significa che si potrebbe scrivere:

$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); 

Dove $this->db->last_query() visualizzerà:

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 

Si noti che i campi in cui è stato utilizzato set() non hanno virgolette e vengono visualizzati in primo luogo. Il resto della query ha arretrati (lasciando "CodeIgniter protect the remaining fields").

Problemi correlati