April
25
2008

Estou desenvolvendo um sistema grande usando o framework CakePHP e surgiu uma necessidade. Precisava criar uma pseudo-coluna com o resultado do cálculo de outras duas. Seguindo o conceito de MVC, achei mais interessante fazer este cálculo no Model para poder usar em todos os programas que utiizam aquela tabela. 

Para ilustrar isto montei um exemplo. Criei a seguinte tabela:

  1. CREATE TABLE IF NOT EXISTS `clientes` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `nome` varchar(100) NOT NULL,
  4.   `sobrenome` varchar(100) NOT NULL,
  5.   PRIMARY KEY  (`id`)
  6. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

O Model da tabela ficou da seguinte forma:

  1. class Cliente extends AppModel {
  2.  
  3.   var $name = 'Cliente';
  4.   var $validate = array(
  5.   'id' => VALID_NOT_EMPTY,
  6.   'nome' => VALID_NOT_EMPTY,
  7.   'sobrenome' => VALID_NOT_EMPTY,
  8.   );
  9.  
  10.   /*
  11.   funcao que é executada toda vez que é realizado uma consulta na tabela  
  12.   esta funcao adiciona o nome completo do cliente ao resultado como uma pseudo-coluna.
  13.   idéia tirada de http://www.paulherron.net/articles/view/cakephp_afterfind_psuedofield
  14.   */
  15.   function afterFind($results) {
  16.      if(isset($results['0']['Cliente'])) {
  17.        foreach ($results as $key => $val) {
  18.          $results[$key]['Cliente']['nome_completo'] = $results[$key]['Cliente']['nome']  . $results[$key]['Cliente']['sobrenome'] ;
  19.        }
  20.     }
  21.    return $results;
  22.   }
  23. }

E na visão eu simplesmente imprimo a pseudo-coluna: 

echo $cliente['Cliente']['nome_completo'];

Simples assim. 

One Comment

Poxa cara! Vlw pela dica =D
Eu tava precisando de uma coisa assim pra calcular a idade, e já implementei no meu sistema. Antes eu estava fazendo o cálculo via controller, mas não faz sentido, já que esta é uma logica do Model né?
O código fica mais clean e menos repetitivo, já que eu não preciso calcular TODA VEZ q precisar da idade do usuário =]
Mais uma vez, vlw pela dica aí!
[]’s

Something to say?

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.