-
Notifications
You must be signed in to change notification settings - Fork 6
Usando DAO e VO
Esse capítulo depende do capitulo de conexão com banco de dados.
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
É 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/
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
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.
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
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
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.
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
Vamos incrementar a primeira aplicação.
- Crie a pasta
dao
dentro do appteste - Crie os arquivos
Tb_pedidoDAO.class.php
eTb_pedidoVO.class.php
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;
}
//--------------------------------------------------------------------------------
}
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 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
)
)
Índice completo - Aprendendo formDin em etapas
Conheça os projetos relacionados ao formDin
- FormDin Last Release - ultima versão estável
- SysGen - Gerador de código para FormDin
- formDocker - Ambiente para o FormDin em Docker
- FormDin5 - FormDin 5 sobre o Adianti FrameWork
- SysGenAd - Gerador de código para FormDin 5 usando o Adianti FrameWork
Aprendendo formDin em etapas
- Baixando o formDin
- Instalado e Configurando Ambiente de Desenvolvimento
- Usando XDebug
- Informações técnicas
- Primeira Aplicação
- Entendendo a primeira aplicação
- Criando Menu Básico
- Conectando com um Banco de Dados
- Usando DAO e VO
- Grid Básico
- Componentes Básicos
- O Formulário
- Relatórios em PDF
- Componentes Avançados
- Autenticando o usuário
- Perfis de acesso
- Grid Avançado
- Conectando com mais um Banco de Dados ao mesmo tempo
- Automatizando a criação de aplicação
- Segurança
- Layout e CSS
- API REST
- Arquitetura do FormDin
- Versões e versionamento
- Usando o Eclipse
- Usando o VS Code
- História do formDin
- Usando PHPUnit para fazer testes unitários
- Usando Composer
- Usando Docker
- Microsoft SQL Server