使用CodeIgniter的活动记录语法递增MySQL数据库字段

63

我有以下的php-codeigniter脚本,试图使用活动记录语法来增加记录的一个字段:

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

以下是生成的SQL:

"UPDATEusersSETvotes= '(votes + 1)' WHEREid= '44'"

该SQL无法运行,但是下面这个SQL可以实现我想要的功能: "UPDATEusersSETvotes= (votes + 1) WHEREid= '44'"` <--注意(votes + 1)周围没有引号

有人知道如何使用CodeIgniter的活动记录语法来实现这种类型的查询吗?

3个回答

125

你可以按照以下方式进行:

$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的预期效果。

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

在更新语句中,您不需要再次使用整个 $data 数组。您只需要一些在运行查询时仍然需要转义的部分。因此,实质上您可能希望将其设置为:$this->db->update('users', ['some_key'=>'some value']); - Akah

0
你可以按照以下方式操作:
    public function increment_product_count(){
        $product_id=$this->input->post('product_id');
        $this->db->where('id', $product_id);
        $this->db->set('click_count', 'click_count+1', FALSE);
        $this->db->update('tbl_product');
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接