Criando uma pseudo-coluna no CakePHP

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:

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

O Model da tabela ficou da seguinte forma:

class Cliente extends AppModel {

  var $name = 'Cliente';
  var $validate = array(
 	'id' => VALID_NOT_EMPTY,
 	'nome' => VALID_NOT_EMPTY,
 	'sobrenome' => VALID_NOT_EMPTY,
  );

  /*
  funcao que é executada toda vez que é realizado uma consulta na tabela
  esta funcao adiciona o nome completo do cliente ao resultado como uma pseudo-coluna.
  idéia tirada de http://www.paulherron.net/articles/view/cakephp_afterfind_psuedofield
  */
  function afterFind($results) {
     if(isset($results['0']['Cliente'])) {
       foreach ($results as $key => $val) {
         $results[$key]['Cliente']['nome_completo'] = $results[$key]['Cliente']['nome']  . $results[$key]['Cliente']['sobrenome'] ;
       }
    }
   return $results;
  }
}

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

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

Simples assim. 

Etiquetado ,

3 thoughts on “Criando uma pseudo-coluna no CakePHP

  1. Éber F Dias disse:

    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

  2. Leandro de Sousa disse:

    E Elton blz?
    sou novo em cakephp estou fazendo um sistema de estoque.

    Gostaria de saber se isso se aplica a uma necessidade minha, é o seguinte:
    Tenho uma tabela chamada de Entrada que tem id, produto_id, qtde_ent, etc…;
    Tenho uma tabela chamada de Estoque que tem id, entrada_id, qtde_estoq, etc…;
    Eu quero saber como faço pra atualizar o meu estoque quando estiver cadastrando a entrada, ou seja, assim que digitar a qtde_ent e salvar na tabela estoque eu receberia o id do produto e a qtde_ent para somar ao estoque já existente.
    Caso possa me ajudar ficarei grato, um grande abraço e sucesso . . .
    :)

  3. vinicius disse:

    Pra quem tiver estudando o Cake, essa solução funciona muito bem. Mas na versão 1.3 tem outra maneira de fazer!

    Você cria no Model um Campo Virtual (VirtualField) com a seguinte sintaxe

    var $virtualFields = array(
    ‘name’ => ‘CONCAT(User.first_nama, ” “, User.last_name)’
    );

    você pode ver mais sobre isso na no book php.

    http://book.cakephp.org/pt/view/1608/Campos-virtuais

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 1.472 other followers