Поле инкремента базы данных mysql c использованием синтаксиса активной записи codeigniter


у меня есть следующий PHP-codeigniter скрипт, который пытается увеличить поле записи с помощью синтаксиса active-record:

$data = array('votes' => '(votes + 1)');
$this->db->where('id', $post['identifier']);
$this->db->update('users', $data);

это производит следующий SQL:

"UPDATEпользователиSETголосов= '(votes + 1)' WHERE id= '44'"

который не работает, но этот SQL делает то, что я ищу: "UPDATEпользователиSETголосов= (votes + 1) WHERE id= '44'"`

кто-нибудь знает, как реализовать этот тип запрос с синтаксисом активной записи codeigniter?

2 52

2 ответа:

вы можете сделать, как показано ниже:

$this->db->where('id', $post['identifier']);
$this->db->set('votes', 'votes+1', FALSE);
$this->db->update('users');

причина, по которой это работает, заключается в том, что третий (необязательный) параметр FALSE сообщает CodeIgniter не защищать сгенерированный запрос с помощью обратных кавычек ('). Это означает, что сгенерированный SQL будет:

UPDATE users SET votes= votes + 1 WHERE id= '44'

Если вы заметили, задние палочки удаляются из '(votes+1)', что дает желаемый эффект увеличения атрибута голосов на 1.

$data = array('votes' => 'votes + 1');

foreach ($data as $key=>$val) {
    $this->db->set($key, $val, FALSE);
}

$this->db->where('id', $post['identifier']);
$this->db->update('users', $data);