Usando o Engine.DB – Parte 2
Dando continuidade a nossa seção de tutoriais simples vamos aprender como o engine.DB trabalha com objetos que utilizam herança.
Nossas entidades consistirão na nossa classe PessoaFisica e na classe Cliente.

[Importante]
- A classe deve ser criada com acessors (getters/setters) definidos.
- Atenção a forma como os comentários são feitos. Para que o PHP reconheça um comentário como PHPDocComment ele deve necessáriamente começar com /** e terminar com */, caso contrário o Engine.DB nao terá acesso as Annotations contidas nele.
- A classe Cliente NÃO possui uma propriedade id mas sua tabela deverá conter um campo INTEGER de mesmo nome do campo chave primária da tabela mãe pois ela o “herda”.
- Heranças de 3 níveis ainda não foram testadas.
Caso nao esteja definido por annotation [@Inheritance] o engine assume por padrão a estratégia TABLE_PER_CLASS ou @Inheritance(type=InheritanceType.TABLE_PER_CLASS).
O código:
<?PHP
<?php
/**
* Engine PHP Application Framework
* http://seelaz.com.br
* File: PessoaFisica.php
**/
/**
* @author Silas R. N. Junior
*/
class PessoaFisica {
/**
* Observe que o nome da classe devera ser identico ao da tabela ou entao
* será preciso definir o nome da tabela com @Table(name="<nome_da_tabela>")
* O mesmo se aplica aos nomes das colunas que utilizam a anotacao @Column(name="<nome_da_coluna>")
* A definição do tipo da propriedade utilizando @var é levada em consideração pelo Engine. Se omitido
* será considerado o tipo string.
*/
/**
* @var int
* @Id - define como chave primaria esta propriedade
*/
private $id;
/**
* @var string
*/
private $rg;
/**
* @return int
*/
public function getId() {
return $this->id;
}
/**
* @param int $newId
* @return void
*/
public function setId($newId) {
$this->id = $newId;
}
/**
* @return string
*/
public function getRg() {
return $this->rg;
}
/**
* @param string $newRg
* @return void
*/
public function setRg($newRg) {
$this->rg = $newRg;
}
}
?>
<?php
/**
* Engine PHP Application Framework
* http://seelaz.com.br
* File: Cliente.php
**/
/**
* @author Silas R. N. Junior
*/
class Cliente extends PessoaFisica {
/**
* @var int
*/
private $codigo;
/**
* @return int
*/
public function getCodigo() {
return $this->codigo;
}
/**
* @param int $newCodigo
* @return void
*/
public function setCodigo($newCodigo) {
$this->codigo = $newCodigo;
}
}
?>
Criando a base de dados.
MySQL
CREATE TABLE IF NOT EXISTS `PessoaFisica` ( `id` int(11) NOT NULL auto_increment, `rg` varchar(7) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; CREATE TABLE IF NOT EXISTS `Cliente` ( `id` int(10) unsigned NOT NULL auto_increment, `codigo` int(11) default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
PostgreSQL
CREATE TABLE "PessoaFisica" ( id serial NOT NULL, rg character varying(7), CONSTRAINT pk_pessoafisica PRIMARY KEY (id) ) WITH (OIDS=TRUE); CREATE TABLE "Cliente" ( id integer NOT NULL, codigo integer, CONSTRAINT pk_cliente PRIMARY KEY (id) ) WITH (OIDS=TRUE);
E agora ao código em si:
require_once("lib/engine/engine.db.php");
//Exemplos de como se criar o driver
//$driver = DbDriverFactory::getDriver(DbDriver::MYSQL);
//$driver = DbDriverFactory::getDriver(DbDriver::PGSQL);
//Para nosso tutorial utilizaremos o MySQL, portanto:
$driver = DbDriverFactory::getDriver(DbDriver::MYSQL);
$driver->configure('<host>','<base_de_dados_ou_schema>','user','pass');
//Criar o DAO
$dao = new DAO($driver);
//Instanciar nossa Entidade
$cliente = new Cliente();
$cliente ->setRg('1111'); //PessoaFisica.rg
$cliente ->setCodigo(12345); //Cliente.codigo
//Gravar
$dao->save($cliente);
//O id é setado automaticamente apos a inserção. Vamos gurdá-lo para carregar a entidade.
$id = $cliente->getId();
unset($cliente);
// Criar uma outra instancia da classe.
$cliente2 = new Cliente();
// Definir o Id que corresponde a entidade no banco
$cliente2->setId($id);
//Carregar os dados
$dao->load($cliente2);
//Confirmar:
echo $cliente2->getRg();
//Modificar no banco:
$cliente2->setRg('2222');
$cliente2->setCodigo('567890');
//Gravar
$dao->save($cliente2);
//Agora para excluir a entidade
$dao->delete($cliente2);
Bom é isso. No proximo artigo vou substituir a herança por composição, seguindo as orientações do GoF (Gang of Four). Até lá!