Trabalhando com contadores utilizando o ActiveRecord no Yii Framework
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.
Eduardo 4:47 pm on December 23, 2011 Permalink
Amigo,
Gostei muito da sua dica, estou utilizando o GRSYNC pra sincronizar meu HD externo com a pasta do Dropbox, pois estou deixando todos meus arquivos lá!
Será que tem como eu colocar no INCRONTAB pra toda vez que o HD externo for montado ele roda o comando sincronizando.
Pois eu acho que se colocar da forma com esta no seu tutorial irei ter problema quando o HD externo não estiver plugado no sistema.
davi 9:51 pm on December 29, 2011 Permalink
Não sei se o incron monitora algum evento relacionado a montagem de discos internos. No seu caso, eu criaria um script que seria executado pelo incron. Nesse script, antes de executar o grsync, basta verificar se o disco de destino está montado.