2010-01-16 3 views
17

Je voulais mettre à jour une ligne en utilisant des enregistrements actifs dans codeigniter, et je veux seulement incrémenter une valeur de champ (received_qty = received_qty +1), j'ai réalisé que je peut le faire en sql d'habitude, mais je ne peux pas dans CodeIgniter dossiers actifsAjouter une clause à une instruction MySQL sans guillemets en utilisant les fonctions 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); 

quelqu'un sait comment le faire en utilisant les dossiers actifs?

Répondre

37

Cela fonctionne.

$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 échappe tout mettre dans un ensemble(), où() et bien d'autres méthodes. Où et set peuvent tous deux prendre un troisième paramètre optionnel de $ escape qui est un booléen. Mettez-le à FALSE et CodeIgniter n'échappera à rien, ce qui signifie que votre incrément de champ ne sera pas traité comme une chaîne.

-2

Vous semblez proche, il n'y a pas de commande 'increment by one' dans ActiveRecord de CI (ou dans SQL d'ailleurs).

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

Désolé mon ami, mais il y a, ActiveRecord échappe simplement toutes les entrées comme une chaîne sauf indication contraire. –

+0

Doit avoir été en retard, ou je frappe la barre plus tôt. Oups. – Zack

2

Ou vous pouvez faire:

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

Vous devrez modifier la clause WHERE vous convient bien

0

état à zéro (mise à jour)

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

je vais poser une question similaire un peu différent, mais le problème était le même: je avais besoin de mettre à jour une date avec un intervalle (expiry_date = expiry_date + interval 3 month) et Phil Sturgeon's answer ont résolu le problème.

Cependant, ce que je pris conscience que vous pouvez toujours utiliser le tableau pour les champs qui peuvent avoir des citations, ce qui signifie que vous pouvez écrire:

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

$this->db->last_query() génèrerait:

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 

Notez que les champs où set() a été utilisé n'ont pas de guillemets et apparaissent en premier lieu. Le reste de la requête a des backticks (laissant "CodeIgniter protect the remaining fields").

Questions connexes