Trabalhando com Models no Zend Framework
3 Comentários
No artigo anterior falei sobre como Configurar um Banco de Dados com Zend Framwork deixando esse banco acessível para que pudesse ser acessado por nossos models, naquele artigo já mostrei que era possível acessar informações do seu banco de dados diretamente no Controller, mas esse não é o verdadeiro espírito de uma arquitetura MVC, o ideal é que trabalhemos com o acesso a dados separadamente das regras de negócios e apresentação, e os elementos utilizados para esse acesso são os models.
Estrutura Usada
Antes de começar a estudar os models no Zend Framework precisamos criar um banco de dados e inserir nele algumas tabelas para que possamos testar o funcionamento dos models em um ambiente real. Para critério de estudo vou trabalhar com a estrutura fictícia apresentada na imagem ao lado de um sistema de agenda para múltiplos usuários.
Se você está utilizando banco de dados MySQL pode copiar a instrução SQL abaixo e inserir no seu banco de dados, se está utilizando algum outro SGBD talvez sejam necessárias algumas alterações no comando SQL.
CREATE TABLE Usuario (idUsuario int(11) NOT NULL AUTO_INCREMENT, nomeUsuario varchar(255) NOT NULL, loginUsuario varchar(255) NOT NULL, senhaUsuario varchar(255) NOT NULL, mailUsuario varchar(255) NOT NULL, CONSTRAINT idUsuario PRIMARY KEY (idUsuario)); CREATE TABLE Compromisso (idCompromisso int(11) NOT NULL AUTO_INCREMENT, idUsuario int(11) NOT NULL, nomeCompromisso varchar(255) NOT NULL, dataCompromisso timestamp NOT NULL, dscCompromisso text, CONSTRAINT idCompromisso PRIMARY KEY (idCompromisso));
Criando os Models
No banco de dados modelo apresentado nós temos duas tabelas e portanto teremos que criar dois arquivos de model, se você está utilizando a estrutura de diretórios propostas no começo da série de artigos, a mesma recomendada pela Zend e criada através da ferramenta Zend Tool, muito provavelmente existe uma pasta models dentro do diretório application, é nessa pasta que devemos criar nossos arquivos models.
Seguindo a convenção de nomenclatura do Zend Framework o primeiro desses arquivo deve se chamar Usuario.php e conter o seguinte código:
<?php
class Application_Models_Usuario extends Zend_Db_Table_Abstract
{
protected $_name = 'Usuario';
protected $_primary = 'idUsuario';
}
?>
E o segundo arquivo deve se chamar Compromisso.php e conter o seguinte código
<?php
class Application_Models_Compromisso extends Zend_Db_Table_Abstract
{
protected $_name = 'Compromisso';
protected $_primary = 'idCompromisso';
}
?>
Como você pode notar é uma classe simples que estende Zend_Db_Table_Abstract com apenas duas variáveis protegidas $_name que contém o nome da tabela do banco de dados à qual esse model se refere, e $_primary que contém o nome da chave primaria dessa tabela, se você omitir essa variável no seu banco de dados o Zend Framework interpretará automaticamente que a chave primaria dessa tabela é “id” se sua chave primaria tiver realmente esse nome portando você não precisa expressamente declarar essa variável.
Acessando Models no Controller
Acessar os models no controller é mais fácil ainda do que criá-los, como nós criamos os models seguindo a convenção de nomenclatura do Zend Franework tudo que precisamos fazer é criar uma instância dessa classe da seguinte forma:
$usuarioModel = new Application_Models_Usuario(); $compromissoModel = new Application_Models_Compromisso();
E a partir dai chamar os métodos que atenderem as necessidades da sua aplicação
Buscando Elementos
Existem três ocasiões principais onde você necessitará buscar informações no banco de dados, a primeira é quando você deseja buscar uma linha específica da sua tabela do banco de dados a partir da sua chave primaria, a segundo quando você deseja buscar uma linha da sua tabela a partir de outro elemento que não seja sua chave primaria e a terceira quando você desejar buscar um conjunto de linhas da sua tabela.
O Método find()
O método find() irá auxiliá-lo na primeira dessas opções, para usá-lo basta fazer o seguinte:
$usuarioBuscado = $usuarioModel->find(1);
Onde “1″ e o código do usuário que deseja buscar, esse método retornará a linha especifica do usuário buscado ou false caso ela não seja encontrada e a partir dai você pode fazer o que quiser com essa informação como por exemplo imprimir o novo do usuário na tela da seguinte forma:
echo $usuarioBuscado->nomeUsuario;
O Método fetchRow()
Esse método irá auxiliá-lo na segunda das hipóteses apresentada, ele pode receber dois parâmetros, nenhum deles sendo obrigatório, se você não passar parâmetro nenhum ele retornará a primeira linha daquela tabela no banco de dados, além disso você pode passar um parâmetro where da seguinte forma
$usuarioBuscado = $usuarioModel->fetchRow(' loginUsuario = "login" ');
E ainda pode passar um parâmetro order da seguinte forma:
$compromissoBuscado = $compromissoModel->fetchRow(' nomeCompromisso = "Programar" ', 'dataCompromisso DESC');
E poderá usar a informação retornada da mesma forma que no método anterior
O Método fetchAll()
Esse método é muito parecido com o anterior exceto pelo fato que ele retorna um conjunto de linhas e não somente uma linha. Além disso ele pode receber mais dois parâmetros $limit e $offset após os dois parâmetros apresentados anteriormente nessa ordem, com isso você pode limitar o número de linhas que deseja receber como retorno e definir a partir de qual linha ele começara a retornar da seguinte forma.
$compromissoBuscado = $compromissoModel->fetchRow(' nomeCompromisso = "Programar" ', 'dataCompromisso DESC', 10, 5);
Como esse método retorna um conjunto de linhas e não apenas uma linha o modo de usá-lo é um pouco diferente, mas tão simples quanto, caso você queira imprimir o nome de todos esse compromissos você pode fazer da seguinte forma:
foreach($compromissoBuscado as $row){
echo $row->nomeCompromisso;
}
Inserindo Elementos
Para inserir elementos nas suas tabelas de banco de dados a partir dos models você deverá usar o método insert(), esse método recebe apenas um parâmetro, um array associativo de valores para as colunas do banco de dados, dessa forma tudo que você precisa fazer é criar um array que tenha como chaves as colunas dos seu banco de dados e como valores as informações que deseja inserir nessa tabela, e então passa-lo como parâmetro para o método insert() como no exemplo a seguir:
$valores = array(
'nomeUsuario' => 'nomedousuario',
'loginUsuario' =>'logindousuario',
'senhaUsuario' =>'senhadousuario',
'mailUsuario' =>'maildousuario'
);
$linhasinseridas = $usuarioModel->insert($valores);
Esse método retorna o número de linhas inseridas no banco de dados, portanto nesse caso irá retornar 1 se a linha for inserida com sucesso e 0 caso não seja.
Atualizando Elementos
O método update() utilizado para atualizar elementos na tabela é muito parecido com o método insert(), exceto que recebe como segundo parâmetro uma cláusula where que define quais linhas serão atualizadas, dessa forma para atualizar uma linha do banco de dados você deve proceder da seguinte forma:
$valores = array(
'nomeUsuario' => 'nomedousuario',
'loginUsuario' =>'logindousuario',
'senhaUsuario' =>'senhadousuario',
'mailUsuario' =>'maildousuario'
);
$linhasatualizadas = $usuarioModel->update($valores, 'idUsuario = 1');
Esse método também retorna o número de linhas atualizadas no banco de dados.
Deletando Elementos
Deletar elementos é o mais fácil dos métodos apresentados, tudo que você tem que fazer é chamar esse método e passar como único parâmetro uma clausula where que define quais linhas devem ser deletadas da seguinte forma:
$linhasdeletadas = $usuarioModel->delete('idUsuario = 1');
Esse método também retorna o número de linhas deletadas no banco de dados.
Conclusão
Trabalhar com modelos no Zend Framework é bem simples, e dessa forma você mantêm total separação das três camadas na sua aplicação, mas o que você aprendeu aqui foi somente o princípio básico do trabalho com models no Zend Framework, você ainda pode criar seus próprios métodos nos seus models para fazer verificações que achar necessárias, sobrescrever os métodos existentes, configurar o relacionamento das tabelas do seu banco de dados e muito mais, mas isso é assunto para um possível próximo artigo.

[...] escrevi aqui no blog sobre como Configurar um Banco de Dados com Zend Framework e Trabalhar com Models no Zend Framework, porém em muitos casos além de acessar as entradas no banco de dados de uma única tabela nós [...]
boa noite , tenho uma duvida .
é possivel criar a chamada de um controle dentro de outro controle ?exemplo :
class IndexController extends Zend_Controller_Action{ public function decideBuscaAction(){ $post = Zend_Registry::get('post'); $tipodepesquisa = $post->escolha; if($tipodepesquisa == "turma"){ $turma = new TurmaController($request, $response, $invokeArgs); $turma->mostrarCorpo2Action(); }else if($tipodepesquisa =="academicos"){ } } }como que eu crio o objeto de turmaController ?o que sao esses $requeste , $response ,&invok ..
Ola Marcio,
Teoricamente é possível sim, porém você deve tomar alguns cuidades, por exemplo, por padrão os controllers do Zend Framework retornam a view diretamente para ser impressa em tela, isso também aconteceria caso você chamasse um controller de dentro de outro controller. Mas sinceramente não recomendo que você realize dessa forma, chamar controllers dentro de outros poderia bagunçar um pouco sua aplicação e tornar a manutenção da mesma bastante difícil, se puder me dizer com mais detalhes o que pretende fazer com sua aplicação posso ver para você se existe uma maneira melhor de fazer isso.
Qualquer coisa avise.