Vamos supor, por exemplo, que você está desenvolvendo um blog ou algum outro tipo de CMS e quer registrar o número de vezes que cada post foi acessado (talvez para mostrar uma lista dos mais visitados). A maneira mais fácil de fazer isso é adicionar uma coluna na tabela de posts, que será utilizada para armazenar o número de visitas para aquele item. Cada vez que um post for exibido o valor dessa coluna será aumentado em 1. O código para fazer isso é algo parecido com isso:
public function actionView($id) {
$post = Post::model()->findByPk($id);
$post->visitas += 1;
$post->save();
$this->render('view', array('post' => $post));
}
Essa abordagem tem dois problemas. Queremos atualizar apenas a coluna visitas, mas todo o registro do post será atualizado. Além disse, caso o argumento false não seja passado para o método save, todo o processo de validação será executado. Desde a versão 1.1.8, a classe CActiveRecord tem um método que pode nos ajudar com isso. Trata-se do método CActiveRecord::saveCounters() e a sua utilização é muito simples:
public function actionView($id) {
$post = Post::model()->findByPk($id);
$post->saveCounters(array('visitas'=>1));
$this->render('view', array('post' => $post));
}
Com isso, somente a coluna visitas será atualizada e a validação não será disparada. Caso você ainda não utilize a versão 1.1.8, você pode utilizar o método CActiveRecord::updateCounters() :
public function actionView($id) {
$post = Post::model()->findByPk($id);
$post->updateCounters(
array('visitas'=>1),
array('condition' => "id = :id"),
array(':id' => $this->id),
);
$this->render('view', array('post' => $post));
}
O trecho de código acima faz exatamente o mesmo que o saveCounters. Note que o método updateCounters tem dois parâmetros a mais. Depois de informar a coluna utilizada para contar, é preciso passar uma condição que diz qual registro deverá ser atualizado. Se você utilizou algum parâmetro nessa condição (como o “:id”), você também deve informar o valor dele, utilizando o terceiro argumento do método.
Importante: Se você não informar nenhuma condição, todos os registros serão atualizados.