Zend Framework – Parte 4 – Banco de Dados
| Tweet |
|
Toda manipulação de banco de dados com o Zend é realizada por meio de objetos, você não precisará escrever códigos em SQL (Structured Query Language) para fazer suas consultas, isso é uma vantagem pensando no ponto de vista da portabilidade, pois se você precisar mudar de plataforma de banco de dados, bastará mudar o adaptador no arquivo de configuração do projeto e pronto tudo funcionará sem que você precise corrigir suas querys para o novo banco, pois o próprio Zend ja trata essas diferenças internamente.
A classe Zend_Db_Table é uma interface orientada a objetos para tabelas de banco de dados. Ela fornece métodos para muitas operações comuns em tabelas. A classe base é extensível, assim você pode adicionar lógica personalizada.
Diferentemente de algumas soluções conhecidas de abstração de dados como Doctrine (PHP), e Hibernate (Java), Zend_Db_Table não é um ORM (Object-relational mapping), ou seja, o banco de dados não é mapeado em forma de classes para tabelas e atributos para cada colunas. No Zend as consultas escritas como objetos são traduzidas para comandos SQL mas isso fica abstraido da visão do programador, o acesso as tabelas se dará por uma classe que extende a Zend_Db_Table, veremos adiante alguns exemplos práticos.
Seguindo na implementação do projeto “Agenda”, criei uma modelagem simples usando o MySQL Workbench:

Na primeira parte desse tutorial configuramos o ambiente com suporte ao MySQL, sendo assim será esse o banco de dados usado a partir de agora.
Crie o banco de dados “agenda”, e adicione as tabelas conforme na modelagem, isso pode ser feito de várias formas, uma delas é usando o prório MySQL Workbenck com o recurso de “Syncronize Model” que cria automaticamente as tabelas ou executar os comandos SQL no seu gerenciador favorito:
CREATE DATABASE agenda;
USE agenda;
CREATE TABLE IF NOT EXISTS agenda.contato (
contato_id INT UNSIGNED NOT NULL AUTO_INCREMENT ,
contato_nome VARCHAR(80) NOT NULL ,
contato_telefone VARCHAR(20) NULL ,
contato_email VARCHAR(255) NULL ,
PRIMARY KEY (contato_id)
)ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS agenda.evento (
evento_id INT UNSIGNED NOT NULL AUTO_INCREMENT ,
contato_id INT UNSIGNED NOT NULL ,
evento_titulo VARCHAR(80) NOT NULL ,
evento_descricao TEXT NULL ,
evento_data DATE NULL ,
PRIMARY KEY (evento_id) ,
INDEX contato_id_evento (contato_id ASC) ,
CONSTRAINT contato_id_evento
FOREIGN KEY (contato_id )
REFERENCES agenda.contato (contato_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)ENGINE = InnoDB;
Se você usa WAMP deve ter o PhpMyAdmin disponível pelo menu na barra de tarefas, execute esses comandos pela aba SQL. Mas caso seja usuário de Linux (Recomendo) acesse o MySQL pelo console:
mysql -u root -p
Execute os comandos SQL individualmente, bloco a bloco.
Banco de dados criado, agora podemos configurar o Zend para conectar no mesmo. Em modo console execute o comando a seguir:
zf configure db-adapter "adapter=PDO_MYSQL&dbname=agenda&host=localhost&username=root&password=root" production
Esse comando irá adicionar os parâmetros de conexão no arquivo de configuração (application/configs/application.ini) no setor production.
Agora criaremos as classes DAO’s (Data Access Object) automaticamente, executando o comando:
zf create db-table.from-database
Esse comando criará os arquivos “application/models/DbTable/Contato.php” e “application/models/DbTable/Evento.php” que são as classes que você instancia-rá para manipular os dados, mas como boa prática de desenvolvimento com Zend as regras de negócio não serão implementadas nesses arquivos mas sim nas Models.
Para criar uma model use o comando:
zf create model Contato
Esse comando criará o arquivo “application/models/Contato.php” com a classe Application_Model_Contato, e é nela que iremos adicionar os métodos para manipular os dados, como no exemplo abaixo:
Edite o arquivo “application/models/Contato.php”:
<?php
class Application_Model_Contato
{
public function select($where = null, $order = null, $limit = null)
{
$dao = new Application_Model_DbTable_Contato();
$select = $dao->select()->from($dao)->order($order)->limit($limit);
if(!is_null($where)){
$select->where($where);
}
return $dao->fetchAll($select)->toArray();
}
public function find($id)
{
$dao = new Application_Model_DbTable_Contato();
$arr = $dao->find($id)->toArray();
return $arr[0];
}
public function insert(array $request)
{
$dao = new Application_Model_DbTable_Contato();
$dados = array(
'contato_nome' => $request['contato_nome'],
'contato_telefone' => $request['contato_telefone'],
'contato_email' => $request['contato_email']
);
return $dao->insert($dados);
}
public function update(array $request)
{
$dao = new Application_Model_DbTable_Contato();
$dados = array(
'contato_nome' => $request['contato_nome'],
'contato_telefone' => $request['contato_telefone'],
'contato_email' => $request['contato_email']
);
$where = $dao->getAdapter()->quoteInto("contato_id = ?", $request['contato_id']);
$dao->update($dados, $where);
}
public function delete($id)
{
$dao = new Application_Model_DbTable_Contato();
$where = $dao->getAdapter()->quoteInto("contato_id = ?", $id);
$dao->delete($where);
}
}
?>
Por enquanto é isso, na próxima parte do Tutorial veremos como fazer um CRUD (Create, Read, Update e Delete) usando a estrutura criada até agora.
Artigos Relacionados
Tags:Banco de Dados, Framework, Mini Curso, PHP, Tutorial, Tutorial Zend, Zend

Então me esclareça uma dúvida por favor, qual seria a diferença então, entre o ORM o e Zend_Db_Table? Por exemplo usar o doctrine seria melhor que somente o Zend_Db_Table? Estou começando com o zend a pouco e gostaria de saber qual a melhor opção e porque usar um ou outro.
Grato…
Ótimo o tutorial….