アクティブレコード構文を使用してレコードのフィールドをインクリメントしようとする次のphp-codeigniterスクリプトがあります。
_$data = array('votes' => '(votes + 1)');
$this->db->where('id', $post['identifier']);
$this->db->update('users', $data);
_
これにより、次のSQLが生成されます。
_"UPDATE
_ users SET
votes= '(votes + 1)' WHERE
id _= '44'
_ "
これは実行されませんが、このSQLは私が探しているものを実行します:_"UPDATE
_ users SET
votes= (votes + 1) WHERE
id _= '44'
_ "` <-投票+ 1)
Codeigniterのアクティブレコード構文を使用してこのタイプのクエリを実装する方法を知っている人はいますか?
以下のようにできます:
$this->db->where('id', $post['identifier']);
$this->db->set('votes', 'votes+1', FALSE);
$this->db->update('users');
これが機能する理由は、3番目(オプション)のFALSEパラメーターがCodeIgniterに生成されたクエリをバックティック('
)。つまり、生成されるSQLは次のようになります。UPDATE users SET votes= votes + 1 WHERE id= '44'
気づいた場合、'(votes+1)'
からバックティックが削除されます。これにより、votes属性が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);
以下のようにできます:
public function increament_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');
}