Usando DAO e VO - bjverde/formDin GitHub Wiki

Esse capítulo depende do capitulo de conexão com banco de dados.

O que é DAO ?

Objeto de acesso a dados (ou simplesmente DAO, acrônimo de Data Access Object), é um padrão para persistência de dados que permite separar regras de negócio das regras de acesso a banco de dados. Numa aplicação que utilize a arquitetura MVC, todas as funcionalidades de bancos de dados, tais como obter as conexões, mapear objetos com relacional (tipos de dados SQL) ou executar comandos SQL, devem ser feitas por classes DAO.

Mais informações https://pt.wikipedia.org/wiki/Objeto_de_acesso_a_dados

O que é VO ?

É um objeto usado basicamente para exibir dados na camada de apresentação. Uma noção formal do que é de fato um “value object”

Mais informações

Padrão formDin

O formDin não utiliza ferramentas para ORM, tudo é feito via PDO com SQL na classe DAO. Em um capitulo futuro terá uma breve explicação dos motivos de não usar ORM.

  • Todos os arquivos de DAO e VO devem ficar na pasta dao da sua aplicação
  • Todos os arquivos de DAO devem terminar com DAO.class.php e estendem TPDOConnection
  • Os arquivo DAO tem os métodos para acesso ao banco de dados. Usando scritps SQL no modelo PDO. O exemplo padrão é ter os métodos para o CRUD (Insert, SELECT, UPDATE, DELETE ) e outras operações necessárias.
  • Nos arquivos DAO o método self::executeSql irá abstrair tudo relativo a classe PDO.
  • Todos os arquivos de VO devem terminar com VO.class.php
  • Os arquivo VO geralmente tem apenas atributos e métodos get e set

Dicas para modelar o banco de dados.

As dicas abaixo são validas para bancos relacionais que é o foco do formDin, apesar de funcionar com o MongoDB.

Siga as dicas e terá seu tempo poupado no momento do desenvolvimento. Lembre-se a sua informação está no banco de dados, então cuide muito bem dele. Foque em um banco bem modelado e com dicionário de dados. Esse é um dos segredos do formDin para conseguir fazer tudo de forma mais rápida e fácil.

NÃO use chaves primarias composta !!

Os artigos abaixo explicam melhor o motivo para não usar chave primaria composta.

7 motivos para não usar chaves compostas

Qual a diferença entrePrimary Key e Unique Key

Use VIEWS e/ou SubSelects

O banco é muito bom e performático em mostrar os dados, então use o banco de dados. Não são seja Bancofóbico !!

USE views e subselects para mostrar dados legíveis substituindo chaves estrangeiras. Quando fiz isso procure mostra sempre o código da chave estrangeira e a sua descrição. Isso irá facilitar em vários momentos quando criar formulários.

A imagem abaixo ilustra bem o que deve ser feito. Exemplo de View

Fonte da imagem: http://www.sql-datatools.com/2015/09/sql-views.html

Procure criar chaves primarias (PK) com nomes únicos.

Algumas pessoas usam sempre o mesmo nome para todas as PK em todas as tabelas, EVITE isso ! Exemplos comuns: ID, COD, ICODIGO e etc.

Procure criar chaves primarias (PK) com nomes únicos. Exemplos: Na tabela Produto um bom nome de PK pode ser idProduto ou Produtoid ou codProduto ou ProdutoCod, Na tabela Pedido um nome de PK pode ser idPedido ou PedidoId ou codPedido ou PedidoCod.

Lembrando a PK em uma tabela será a FK em outra, logo procure usar o mesmo nome da PK quando for FK.

A imagem do exemplo acima segue esse principio.

Tabelas de apoio

Em tabelas de apoio e referenciadas procure criar os campos da tabela na ordem ID, DESCRICAO. Isso irá facilitar no momento de usar o SysGen

Incrementando a Primeira Aplicação

Vamos incrementar a primeira aplicação.

  1. Crie a pasta dao dentro do appteste
  2. Crie os arquivos Tb_pedidoDAO.class.php e Tb_pedidoVO.class.php

Criando a VO

Edite o arquivo Tb_pedidoVO.class.php, cole o conteúdo abaixo

<?php
class Tb_pedidoVO
{
    private $id_pedido = null;
    private $data_pedido = null;
    private $nome_comprador = null;
    private $forma_pagamento = null;
    public function __construct($id_pedido = null, $data_pedido = null, $nome_comprador = null, $forma_pagamento = null)
    {
        $this->setId_pedido($id_pedido);
        $this->setData_pedido($data_pedido);
        $this->setNome_comprador($nome_comprador);
        $this->setForma_pagamento($forma_pagamento);
    }
    //--------------------------------------------------------------------------------
    function setId_pedido($strNewValue = null)
    {
        $this->id_pedido = $strNewValue;
    }
    function getId_pedido()
    {
        return $this->id_pedido;
    }
    //--------------------------------------------------------------------------------
    function setData_pedido($strNewValue = null)
    {
        $this->data_pedido = $strNewValue;
    }
    function getData_pedido()
    {
        return is_null($this->data_pedido) ? date('Y-m-d') : $this->data_pedido;
    }
    //--------------------------------------------------------------------------------
    function setNome_comprador($strNewValue = null)
    {
        $this->nome_comprador = $strNewValue;
    }
    function getNome_comprador()
    {
        return $this->nome_comprador;
    }
    //--------------------------------------------------------------------------------
    function setForma_pagamento($strNewValue = null)
    {
        $this->forma_pagamento = $strNewValue;
    }
    function getForma_pagamento()
    {
        return $this->forma_pagamento;
    }
    //--------------------------------------------------------------------------------
}

Criando a DAO

Edite o arquivo Tb_pedidoDAO.class.php, cole o conteúdo abaixo. Reparei que os scripts SQL usam o modelo PDO, a passagem de parâmetros pode ser feita pela variável $values que é um array

ATENÇÃO depois do SysGen v1.6.0 o recomendável é não usar métodos estáticos para facilitar testes unitários como PHPUnit . Contudo esse tutorial continua válido e funcional

<?php
class Tb_pedidoDAO extends TPDOConnection
{
    
    private static $sqlBasicSelect = 'select
					 id_pedido
					,data_pedido
					,nome_comprador
					,forma_pagamento
					from tb_pedido ';
    
    //--------------------------------------------------------------------------------
    public static function selectById($id)
    {
        $values = array($id);
        $sql = self::$sqlBasicSelect.' where id_pedido = ?';
        return self::executeSql($sql, $values);
    }
    //--------------------------------------------------------------------------------
    public static function selectAll($orderBy = null, $where = null)
    {
        $sql = self::$sqlBasicSelect.
					( ($where)? ' where '.$where:'').
					( ($orderBy) ? ' order by '.$orderBy:'');
					return self::executeSql($sql);
    }
    //--------------------------------------------------------------------------------
    public static function insert(Tb_pedidoVO $objVo) {
        $values = array( $objVo->getData_pedido()
            , $objVo->getNome_comprador()
            , $objVo->getForma_pagamento()
        );
        $sql = 'insert into tb_pedido(
								 data_pedido
								,nome_comprador
								,forma_pagamento
								) values (?,?,?)';
        self::executeSql($sql, $values);
        return  self::executeSql('select last_insert_rowid() as ID_PEDIDO');
    }
    //--------------------------------------------------------------------------------
    public static function update(Tb_pedidoVO $objVo)
    {
        $values = array( $objVo->getData_pedido()
            ,$objVo->getnome_comprador()
            ,$objVo->getForma_pagamento()
            ,$objVo->getId_pedido() );
        $sql = 'update tb_pedido set
						 data_pedido = ?
						,nome_comprador = ?
						,forma_pagamento = ?
						where id_pedido = ?';
        return self::executeSql( $sql, $values);
    }
    //--------------------------------------------------------------------------------
    public static function delete($id)
    {
        $values = array($id);
        $sql = 'delete from tb_pedido where id_pedido = ?';
        return self::executeSql($sql, $values);
    }
}

O Array FormDin

O Resultado dos select feitos com

$sql = 'select
              id_pedido
	      ,data_pedido
	      ,nome_comprador
	      ,forma_pagamento
from tb_pedido';
$dados = self::executeSql( $sql, $values);

Irão aparecer com o array no formato

$dados = Array
(
    [ID_PEDIDO] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )

    [DATA_PEDIDO] => Array
        (
            [0] => 14/09/2014
            [1] => 10/09/2014
            [2] => 17/09/2014
            [3] => 11/09/2014
        )

    [NOME_COMPRADOR] => Array
        (
            [0] => FX
            [1] => JT
            [2] => Joceli
            [3] => Eliana
        )

    [FORMA_PAGAMENTO] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 1
            [3] => 1
        )

)

Próxima etapa ?

10 - Grid Básico