Página Inicial > tutoriais > Usando o Engine.DB – Parte 2

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.

objheranca-pessoafisica-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 INTEGE R

    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);

Download do Código-fonte

Bom é isso. No proximo artigo vou substituir a herança por composição, seguindo as orientações do GoF (Gang of Four). Até lá!

  1. Tiago Franco
    23, setembro, 2011 em 16:45 | #1

    Ola, parabens pelo framework. Pois entao, como que eu faço para mapear campos do tipo datetime? É semelhante ao hibernate do java?

    Att

  2. 23, setembro, 2011 em 18:12 | #2

    Olá Tiago,
    Pois bem, se voce utilizar @var datetime na anotação da propriedade, o engine irá admitir o valor em string no formato dd/mm/yyyy hh:mm:ss.
    Por exemplo:

    – na classe:
    /** Data llimite da publicacao
    * @var datetime
    */
    private $dataLimite;

    – uso:
    $publicacao->setDataLimite(“01/01/2012 00:01:00″);

    Espero ter ajudado. Senão, voce pode utilizar o fórum para prosseguirmos. Obrigado.

  3. Tiago Franco
    3, outubro, 2011 em 16:00 | #3

    Olá Seelaz, boa tarde.
    Me ajudou sim e bastante. Estete teu framework se persistência ajudou muito a nossa vida.

    Obrigado, dúvidas a frentes usarei o fórum.

    Att

  1. Nenhum trackback ainda.