Mapeamento de classes Seg, 21 de janeiro de 2008 - as 10h25
O mapeamento de classes com o Lumine ficou mais fácil.
Agora, ele é feito dentro do próprio arquivo PHP, o que torna o processo bem mais rápido, além de você ter que alterar somente em um local caso haja necessidade de alteração.
Supondo que você tenha a tabela descrita como a abaixo:
+---------------+-------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+------------+----------------+
| idpessoa | int(11) | | PRI | NULL | auto_increment |
| idgrupo | int(11) | | MUL | NULL | |
| nome | text | | | | |
| idade | int(11) | YES | | NULL | |
| data_cadastro | date | | | 0000-00-00 | |
+---------------+-------------+------+-----+------------+----------------+
Ficaria semelhante a:
<?php
class Pessoa extends Lumine_Base {
// sobrecarga
protected $_tablename = 'tbl_pessoa';
protected $_package = 'entidades';
/**
* Inicia os valores da classe
* @author Hugo Ferreira da Silva
* @return void
*/
protected function _initialize()
{
# nome_do_membro, nome_da_coluna, tipo, comprimento, opcoes
$this->_addField
('idpessoa', 'idpessoa', 'int', 11
, array('primary' => true, 'notnull' => true, 'autoincrement' => true));
$this->_addField
('grupo', 'idgrupo', 'int', 11
, array('foreign' => '1', 'onUpdate' => 'CASCADE', 'onDelete' => 'CASCADE', 'linkOn' => 'idgrupo', 'class' => 'Grupo'));
$this->_addField
('nome', 'nome', 'varchar', 150
, array('notnull'=>true
));
$this->_addField
('idade', 'idade', 'int', 11
, array());
$this->_addField
('data_cadastro', 'data_cadastro', 'date', null, array('notnull' => true));
}
/**
* Recupera um objeto estaticamente
* @author Hugo Ferreira da Silva
* @return void
*/
public static function staticGet($pk, $pkValue = null)
{
$obj = new Pessoa;
$obj->get($pk, $pkValue);
return $obj;
}
}
?>
Ao invés de ser utilizado um arquivo XML, como era antes, o mapeamento é feito diretamente dentro da classe, através de dois métodos: _addField e _addForeignRelation.
Este primeiro método, adiciona os campos que existem suas tabelas. O segundo é para relacionamento externo (leia sobre relacionamentos para entender mais).
$this->_addField
(String
$nome_membro, String
$nome_coluna, String
$tipo_coluna, int
$comprimento_coluna, Array $opcoes);
Como pode ser notado, Lumine trabalha com um nome da propriedade e com nome da coluna na tabela. Assim, você pode diferenciar o nome de sua coluna e o nome da sua propriedade na classe. Vejamos os detalhes:
- Nome do membro: Nome do membro da classe que representará a coluna de sua tabela;
- Nome da coluna: Nome real da coluna na tabela representada;
- Tipo do campo: tipo do campo da tabela (sem o comprimento);
- Comprimento: comprimento do campo da tabela;
- Opções: Array associativo contendo várias opções:
- primary: indica que é uma chave primária;
- notnull: indica que o campo não pode ser nulo;
- autoincrement: indica que o campo é auto-incrementável (ou serial no caso do PostgreSQL). Em todos os bancos que tiverem campos de auto-numeração, deverá ser indicado como autoincrement => true.
- label: Rótulo para ser utilizado nos formulários gerados pela engenharia reversa. Assim você pode personalizar o formulário;
- displayField: Caso o campo seja um relacionamento com outra tabela, você poderá indicar o nome do campo da outra tabela que conterá o valor a ser exibido na combo de valores;
- foreign: Indica que este campo é um campo que contém valor de uma outra tabela (chave-estrangeira);
- onUpdate: Ação que o banco toma em quando o valor da chave estrangeira for atualizado;
- onDelete: Ação que o banco toma em quando o valor da chave estrangeira for removido;
- linkOn: Nome do membro da entidade estrangeira a qual o campo está vinculado;
- class: Nome da classe de relacionamento com este campo;
- format: Formato de saída do campo (os mesmos suportados pela função sprintf (em caso de strings e números) e strftime (em caso de datas e tempo).
- lazy: permite carregar valores de chaves estrangeiras assim que o registro da entidade que está sendo manipulada for carregado.
- formatter: Permite definir uma função para ser executada quando o valor do campo for requerido.
No tópico
relacionamentos, veremos como trabalhar com chaves estrangeiras e relacionamentos em nosso banco de dados.