Mantenha seu navegador atualizado:



Kohana Buscando dados do banco

Categoria: Kohana Publicado dia: 21/03/2011 11:07:23 Comentários: 0

O Kohana fornece ao desenvolvedor duas formas de acesso ao Banco de Dados. A mais básica é o Módulo Database, que faz a interface com o banco de dados que deseja manipular através de classes básicas como o MYSQL ou o PDO, ainda o mantendo dependente de consultas SQL. Outra é o Módulo ORM, que mapeia o banco de dados na forma de objetos.

Uma coisa que você deve pensar ao escolher uma das metodologias é o quão dependente sua aplicação ficará do Banco de Dados. Como o SQL não é implementado da mesma forma entre os diferentes fabricantes de bancos de dados, de um fabricante para outro ou de uma versão para outra, existem diferenças sutis entre os bancos. E com a escrita de SQL você torna aquele trecho do sistema dependente do banco. Um exemplo hipotético:

 


<?php

//Oracle
$sql "SELECT TO_DATE(data, 'YYYY-MM-DD') from tabela;";

$query $this->db->query($sql);

//MySQl
$sql "SELECT DATE_FORMAT(data,'%Y-%m-%d') from tabela;";

$query $this->db->query($sql);

?>

 

Observe que o nome das funções podem mudar de um banco para outro, bem como a quantidade e formato dos parâmetros. Então, ou você trabalha com apenas um banco e escreve consultas SQL voltadas para este, ou usa o ORM e trabalha de forma independente do banco de dados. E assim, poderá migrar sua aplicação para qualquer banco de dados que deseje.

Por tais motivos, falarei apenas do ORM. Caso deseje saber mais sobre o Database, por favor, consulte a página: Kohana Module Database

Primeiramente, vamos criar um Model chamado Contato na pasta application/classes/model.

 


<?php

class Model_Contato extends ORM {

    protected 
$_belongs_to = array(
        
'area' => array(
            
'model' => 'area',
            
'foreign_key' => 'area_id'
        
),
        
'endereco' => array(
            
'model' => 'endereco',
            
'foreign_key' => 'endereco_id'
        
)
    );
    
    protected 
$_has_one = array();
    
    protected 
$_has_many = array();

    protected 
$_table_name 'contatos';
    protected 
$_primary_key 'id';
    
}

?>

 

Este objeto será responsável por mapear a tabela Contatos existente no banco de dados e os relacionamentos que esta tabela tem com as tabelas de Área (aplicado como categorias) e Endereços.

Vamos fazer o Controller contato em application/classes/controller para gerenciar os contatos e efetuar consultas nele :


<?php

class Controller_Contato extends Controller_Template {

    public 
$template 'index';

    public function 
action_index()
    {
        
//Localiza todos os contatos em ordem descrescente de data de criação
        
$contatos ORM::factory('contato')->order_by('criacao''DESC')->find_all();
        
        
$area ORM::factory('area')->order_by('nome')->find_all();
        
        
//Instancia a view
        
$view View::factory('contato_index');
        
        
//Passa os contatos para a view
        
$view->contatos $contatos;
        
        
//Passa as áreas para a view
        
$view->areas $areas;
        
        
//Passa a view para o template
        
$this->template->content $view;
    }
    
    public function 
action_salvar()
    {
        
//Gera instancia de Model contato
        
$contato ORM::factory('contato');
        
$post Validation::factory($_POST);
        
        
//Seta dados do contato
        
$contato->nome $post->nome;
        
$contato->telefone $post->telefone;
        
$contato->celular $post->celular;
        
$contato->email $post->email;
        
$contato->site $post->site;
        
        
//Busca area pelo id
        
$area ORM::factory('area'$post->area->id);
        
        
//Associa area ao novo contato
        
$contato->area $area;
        
        
//Salva o contato no banco de dados
        
if($contato->save())
        {
            
$this->request->redirect('contato/index');
            exit();
        }
    }
    
    public function 
action_alterar($id)
    {
        
//Localiza contato no banco pelo id
        
$contato ORM::factory('contato'$id);
        
$post Validation::factory($_POST);
        
        
//Seta novos dados do contato
        
$contato->nome $post->nome;
        
$contato->telefone $post->telefone;
        
$contato->celular $post->celular;
        
$contato->email $post->email;
        
$contato->site $post->site;
        
        
//Busca area pelo id
        
$area ORM::factory('area'$post->area->id);
        
        
//Associa area ao contato
        
$contato->area $area;
        
        
//Salva o contato no banco de dados
        
if($contato->save())
        {
            
$this->request->redirect('contato/index');
            exit();
        }
    }
    
    public function 
action_apagar($id)
    {
        
$contato ORM::factory('contato'$id);
        
$contato->delete();
        
$this->request->redirect('contato/index');
        exit();
    }

}
?>

O action index do Controller contato você busca na tabela contatos do banco de dados todos os contatos gravados e passa para a view contato_index que será a responsável por exibir estes contatos encontrados. Durante a busca, aproveitamos para ordenar todos os contatos de acordo com a data em que foram registrados no sistema. Já as áreas foram ordenadas de acordo com o nome delas, para ficar em ordem alfabética.

Neste mesmo action buscamos também todas as áreas [categorias de contato] para exibir como menu.

Vejamos como ficou a view contato_index que demonstrará os resultados obtidos.

Sendo editado.

Comente aqui!