Changes
Title
unchanged
Using counters with ActiveRecord
Category
unchanged
Tips
Yii version
unchanged
Tags
unchanged
activerecord, counters, savecounters, updatecounters
Content
changed
[...]
$post->save();
$this->render('view', array('post' => $post));
}
```
We have twohree problems with this approach. All we want is to update the visits column, but the entire record will be updated. Also, if we didn't pass the false argument to the save method, all the validation process will be executed.
Also if someone in parallel will update record from 4 to 5, we still save it as 5, as our version of post record have 4.
Since 1.1.8, the
CActiveRecord class has a method that can help us with this task. It's the [CActiveRecord::saveCounters()]
method and its usage is pretty simple:[...]
With this, only the visits column will be updated and the validation will not be triggered.
If you're not using the 1.1.8 yet, there's the [CActiveRecord::You can also update multiple models at once by passing a custom criteria to updateCounters()
]:
```php
public function actionView($id) {
$post = Post::model()->
findByPk($id);
$post->updateCounters(
array('visits'=>1),
array('condition' => "id = :id"),
// or another, broader condition
array(':id' => $
this->id),
);
$this->render('view', array('post' => $post));[...]
```
The piece of code above does exactly the same that saveCounters does. Note that updateCounters has two additional parameters. After the column used to count, we pass a condition to tell which record(s) should be updated. If you used any paramater in this condition (like the ":id"), you should pass the parameter value in the third argument of the method.
****Important: If you do not pass a condition, all records will be updated.**