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
- https://www.devmedia.com.br/diferenca-entre-os-patterns-po-pojo-bo-dto-e-vo/28162
- https://carlosschults.net/pt/value-objects-ferramenta/
- https://robsoncastilho.com.br/2013/11/10/trabalhando-com-value-objects/
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.
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.
- Crie a pasta
dao
dentro do appteste - Crie os arquivos
Tb_pedidoDAO.class.php
eTb_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
)
)