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.
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
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 . . .
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