Skip to content
This repository was archived by the owner on Oct 23, 2019. It is now read-only.
alanwillms edited this page Apr 20, 2011 · 3 revisions

Troll Model – Consulta Rápida

0. Instalando

É necessária uma instalação do Zend Framework 1.11 funcionando.

Copie o diretório Troll e seus conteúdos para o diretório library do seu projeto.

Configure o autoloader no bootstrap:

// Usando apenas "ClassName" ao invés de "Model_ClassName"
$autoloader->removeResourceType('model');
$autoloader->addResourceType('model', 'models', '');

// Usando apenas "DbTable_ClassName" ao invés de "Model_DbTable_ClassName"
$autoloader->removeResourceType('DbTable');
$autoloader->addResourceType('DbTable', 'models/DbTable', 'DbTable');     

// Carrega "namespace" Troll_ (no futuro, vamos usar namespaces mesmo.. que venha o Zend 2)
$autoloader->setFallbackAutoloader(true);
$autoloader->registerNamespace(Troll_');

1. Definindo as classes

No exemplo, estamos definindo duas classes relacionadas. Troll_Database_Table é apenas uma especialização da Zend_Db_Table_Abstract, e se comporta como tal.

class DbTable_Servico extends Troll_Database_Table
{
    protected $_name = 'servico';
}
class Servico extends Troll_Model { }
class DbTable_Protocolo extends Troll_Database_Table
{
    protected $_name = 'protocolo';
}
class Protocolo extends Troll_Model {}

2. Relacionamentos

Para definir os relacionamentos, basta indicá-los na classe da tabela, com um atributo adicional refClass, indicando qual o nome da Classe da tabela a qual se refere.

class DbTable_Servico extends Troll_Database_Table
{
    protected $_name = 'servico';

    protected $_dependentTables = array('DbTable_Protocolo');
}
class DbTable_Protocolo extends Troll_Database_Table

{
    protected $_name = 'protocolo';
    protected $_referenceMap    = array(

        'servico' => array( // "servico" será usado como nome de atributo
            'columns'           => 'id_servico', // Colunas da tabela local
            'refClass'          => 'Servico', // Classe ao qual o relacionamento se refere
            'refTableClass'     => 'DbTable_Servico', // Classe da tabela do relacionamento
            'refColumns'        => 'id', // Colunas-chave na tabela-alvo
        ),
    );

}

3. Consultas

Para buscar um registro qualquer, use o método find():

$protocolo = Protocolo::find(12); // Busca o protocolo de ID 12

Você poderá incluir subconsultas na sua busca (desta forma, sem ocorrer o problema N+1):

$protocolos = Protocolo:all(
    ':cols' => array('id', 'nome'), // Somente atributos ID e Nome
    ':include' => array('servico' => array(':cols' => array('id', 'nome'))), // Inclui subtabela "servico", buscando apenas o ID e o Nome
    'id > ?' => 5, // Onde o ID é maior que 5
);

Por padrão, as consultas são feitas passando-se uma coluna e um argumento, ou uma expressão e um argumento:

$protocolos = Protocolo::all(array('id_usuario' =>$usuario->id, 'data > ?' => new Zend_Date()));

No entanto, você poderá simular as consultas do método fetchAll() da seguinte forma:

$protocolos = Protocolo::all(array(':where' =>'id_usuario is not null', ':order' =>'nome desc')); // O mesmo com :limit, :offset

4. Salvar e excluir

Criando um novo registro:

$protocolo = new Protocolo(array('nome' => 'Teste'));

$protocolo->servico = $servico;
 
// Ops! Não salvou!
if (!$protocolo->save()) {
    // Mostre-me os erros
    $protocolo->setFormErrors($form, 'subform_protocolo'); // segundo par. opcional

}
else {
    // Exibir ID do objeto
    echo $protocolo->id;

}

Editando um registro:

$protocolo = Protocolo::find(12); // poderia ser find(array('id' => 12))), mas ele identifica que só há uma coluna PK chamada "id"

$protocolo->nome = 'Outro teste';

Mandando pro espaço!

$protocolo->delete();

5. Validações

Por padrão, a classe identificará validações padrão, como por exemplo os tipos data, número, etc., as larguras máximas de strings e campos do tipo “not null”.

Para validações personalizadas, reescreva o método protegido _customValidations().

////
protected function _customValidations()
{
    // Faça suas validações como bem entender, e retorne setando o valor para false.
    if (false !== strpos($usuario->nome, 'palavrão')) {
        $this->__addError('nome', 'O nome não pode ter palavrão!');
    }
    // Se não quiser gerar uma mensagem de erro, apenas sete o isValid para falso
    # $this->__isValid = false;
}
////

6. Getters e setters especiais

Caso você não queira que o objeto use o setter ou getter padrão, basta re-implementá-lo nos seguintes formatos:

class Protocolo extends Troll_Model
{

    public function setNomeDaColuna($value)
    {
        $this->_attributesData['nome_da_coluna'] = $value; // Ou seja lá o que você precisar

    }
 
    public function getNomeDaColuna()
    {
        return $this->_attributesData['nome_da_coluna'];

    }
}

7. Gatilhos

Caso você precise que a classe execute determinadas operações antes/depois de salvar (ou inserir, ou atualizar) ou excluir, sobrescreva os seguintes métodos protegidos:

beforeSave();   // Antes de salvar, não importa se insere ou atualiza
afterSave();    // Após salvar

beforeInsert(); // Antes de inserir um NOVO registro
afterInsert();  // Depois de inserir
beforeUpdate(); // Antes de atualizar um registro EXISTENTE

afterUpdate();  // Depois de atualizar
beforeDelete(); // Antes de excluir
afterDelete();  // Depois de excluir

8. Apelidos, mapeamento de nomes de colunas x atributos

Em alguns casos você terá uma tabela com determinadas colunas, e os atributos com nomes completamente diferentes. Para resolver isto, veja o seguinte caso:

// Tabela no SGDB Oracle
class DbTable_Pessoa extends Troll_Database_Table
{
    protected $_name = 'PESSOA';

    protected $_attributesMapping = array(
        'id'   => 'CODPES', // Pro objeto, é id, pro banco de dados, é CODPES
        'nome' => 'NOMPES', // Pro objeto é nome, pro banco de dados, é NOMPES
    );
}

Basta realizar esta configuração e o sistema detectará as colunas certas quando você chamar os atributos.

9. Aplicar funções em colunas ou atributos (filtros)

Você também tem a opção de definir determinadas funções que serão aplicadas em uma coluna ao consultá-la.

class DbTable_Pessoa extends Troll_Database_Table
{
    protected $_name = 'PESSOA';
    protected $_selectFilters = array(
        'NOMPES' => 'F_NOME_PROPRIO(?)'
    );
    protected $_attributesMapping = array(
        'id'   => 'CODPES',
        'nome' => 'NOMPES',
    );
}