举个例子,博客系统中,要统计每篇文章的阅读数,就要在每次显示文章时更新数据表的阅读数字段,使它加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'));
}