Zend Framework – Parte 4 – Banco de Dados

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

Postado em : PHP, Programação, Zend Framework
Tags:, , , , , ,

3 Comentários para “Zend Framework – Parte 4 – Banco de Dados”

Adicionar Comentário (+)

  1. Rodrigo disse:

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

    • Evandro Klimpel Balmant disse:

      @Rodrigo um ORM como o próprio nome diz é um Mapeamento Objeto Relacional, ou seja, ele varre seu banco e cria classes para cada entidade e encapsula métodos get/set para cada atributo/coluna dessas entidades, sendo assim a abstração é bem maior para o desenvolvedor, que não escreve querys SQL, mas no caso do Zend_Db_Table não há um mapeamento, nem encapsula get/set, você programa muito perto do SQL, mas há uma abstração, pequena mas há, se você evitar SQL no Zend fica muito fácil portar para outro SGBD.

      Dificil responder qual o melhor, cada caso é um caso, eu quando trabalho com Zend acabo usando o Zend_Db_Table mesmo, mas ja fiz projetos com Doctrine, PEAR DataObject, assim como em java alguns gostam de usar Hibernate outros não.

      Eu tenho comigo que vale a pena estudar todas as opções possíveis, e a cada projeto você tira um kit da cartola e manda bala, sucesso!

Deixe seu Comentário