CakePHP实现字段加1的几种方法

原文发表于 CakePHP中国 http://cakephp.cn/forum.php?mod=viewthread&tid=636&extra=page=1


举个例子,博客系统中,要统计每篇文章的阅读数,就要在每次显示文章时更新数据表的阅读数字段,使它加1。
但是CakePHP模型的save系列方法不支持 array('click'=>'click+1')。
以下的几种方法都不能正确的更新:
public function click($id) {
        $this->Post->id = $id;
        $this->Post->save(array('Post.click'=>'Post.click+1')); //错误
        $this->Post->save(array('Post.click'=>'`Post.click`+1')); //错误
        $this->Post->save(array('Post.click'=>'`Post`.`click`+1')); //错误
        $this->Post->save(array('Post.click'=>'click+1')); //错误
        $this->Post->save(array('Post.click'=>'`click`+1')); //错误
}


下面介绍几种方法:


1. 先读取再更新,缺点:要操作两次
public function click($id) {
        $this->Post->id = $id;
    $post = $this->Post->read();  //读取数据
        $this->Post->saveField('Post.click', $post['Post']['click']+1); //更新数据
}


2.利用Model::updateAll方法,缺点:不能调用beforeSave,afterSave
public function click($id) {
        $this->Post->updateAll(array('Post.click'=>'`Post`.`click`+1'), array('Post.id'=>$id));
}


3.利用SQL expression
public function click($id) {
        $this->Post->id = $id;
        $this->Post->saveField('click', $this->Post->getDataSource()->expression_r('`click`+1'));
}

你可能感兴趣的:(cakephp)