CodeIgniter – Models (Parte II)

No primeiro post sobre a implementação de Models no CodeIgniter eu mostrei como configurar uma conexão da aplicação em CI com um banco de dados. Mostrei também todos os passos desde a criação do Controller e do formulário na View para se criar uma estrutura para se inserir um registro no BD.

Hoje vou continuar abordando os Models no CI e outras possibilidades que o framework oferece no quesito acesso ao banco de dados. Antes de começar recomendo a leitura do post CodeIgniter – Models (Parte I) para aqueles que ainda não o fizeram.

Para esse post vou utilizar o projeto e as configurações definidas no artigo CodeIgniter – Models (Parte I). Pois bem. A estrutura do nosso Produto_model está assim atualmente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
/**
 * Description of Produto_model
 *
 * @author rafael
 */
class Produto_model extends CI_Model {
 
    public $nome;
    public $valor;
 
    public function __construct() {
        parent::__construct();
    }
 
    public function inserir(){
        return $this->db->insert('produto', $this);
    }
}

Vamos agora implementar um método para recuperar os produtos cadastrados no banco:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/**
 * Description of Produto_model
 *
 * @author rafael
 */
class Produto_model extends CI_Model {
 
    public $nome;
    public $valor;
 
    public function __construct() {
        parent::__construct();
    }
 
    public function inserir(){
        return $this->db->insert('produto', $this);
    }
 
    public function get_produtos(){
        $query = $this->db->get('produto');
        return $query->result();
    }
}

Veja que não preciso utilizar “Select” nem qualquer outra coisa relacionado à SQL. O método get que executo a partir do objeto db vai fazer isso para nós. Passo como parâmetro o nome da tabela no banco de dados (nesse caso, produto). Depois o result retorna um array de objetos com todos os registros buscados na consulta. Se você quiser limitar o resultado (cláusula LIMIT do SQL), passe o valor no segundo parâmetros do método get. (O terceiro parâmetro é o OFFSET).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/**
 * Description of Produto_model
 *
 * @author rafael
 */
class Produto_model extends CI_Model {
 
    public $nome;
    public $valor;
 
    public function __construct() {
        parent::__construct();
    }
 
    public function inserir(){
        return $this->db->insert('produto', $this);
    }
 
    public function get_produtos(){
        $query = $this->db->get('produto', 10);//Busca só os 10 primeiros resultados
        return $query->result();
    }
}

Bom, já conseguimos recuperar os produtos que estão cadastrados no banco. Vamos agora implementar o Controller e a View para poder, utilizando os padrões é claro, exibir esses produtos via HTML.

Primeiramente o Controller. Vou criar o arquivo com o nome application/controllers/listar_produtos.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class Listar_produtos extends CI_Controller {
 
        public function __construct() {
            parent::__construct();
        }
 
	public function index(){
            //Carrega o Model
            $this->load->model('Produto_model', '', TRUE);
 
            //Executa o método get_produtos
            $dados['produtos'] = $this->Produto_model->get_produtos();
 
            //Carrega a View
            $this->load->view('listar_produtos', $dados);
	}
}
 
/* End of file listar_produtos.php */
/* Location: ./application/controllers/inserir_produtos.php */

Nada de segredo. Carrego o Produto_model e executo o método get_produtos() que implementamos. Salvo o resultado dentro da variável $dados e depois carrego a view que exibirá os produtos na página.

Vamos criar a view então. (application/views/listar_produtos.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
    <head>
        <title>CodeIgniter - Models</title>
    </head>
    <body>
        <h1>Lista de Produtos</h1>
        <?php foreach ($produtos as $produto) : ?>
            <p><strong>Codigo:</strong> <?php echo $produto->idproduto ?></p>
            <p><strong>Nome:</strong> <?php echo $produto->nome ?></p>
            <p><strong>Valor:</strong> <?php echo $produto->valor ?></p>
            <hr />
        <?php endforeach; ?>
    </body>
</html>

Na view utilizo o foreach para percorrer o array com os produtos e vou exibindo eles. Cada posição do array é um objeto produto onde cada atributo refere ao respectivo atributo na tabela do banco de dados.

Para encerrar, vou implementar dentro do model Produto_model uma função para buscar um determinado produto pelo código (idproduto). Para isso, vou precisar fazer uma busca com where e para isso utilizo o método get_where() do objeto $this->db. Esse método é semelhante ao get() com a exceção de que o segundo parâmetro deve ser um array com as condições de sua consulta. (Assim, o terceiro parâmetro agora é referente ao LIMIT e o quarto ao OFFSET).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
/**
 * Description of Produto_model
 *
 * @author rafael
 */
class Produto_model extends CI_Model {
 
    public $nome;
    public $valor;
 
    public function __construct() {
        parent::__construct();
    }
 
    public function inserir(){
        return $this->db->insert('produto', $this);
    }
 
    public function get_produtos(){
        $query = $this->db->get('produto', 10);//Busca só os 10 primeiros resultados
        return $query->result();
    }
 
    public function get_produto_by_id($idproduto){
        //Busca com condição
        $query = $this->db->get_where('produto', array('idproduto' => $idproduto));
 
        //row_object() retorna direto o objeto produto e não um array
        return $query->row_object();
    }
}

O método get_produto_by_id() recebe como parâmetro o código do produto que se deseja buscar. Vale a ressalva de que como só existe um produto para cada id, a consulta sempre retornará apenas 1 produto. Então eu uso o $query->row_object() para que retorne já um objeto produto e não um array com um único objeto produto.

O CI oferece inúmeras outras funcionalidades para acesso ao banco, inclusive a possibilidade de se construir consultas SQL bem personalizadas. Mas esse é assunto para um post futuro.

Espero ter ajudado.

Abs!

Confira todos os posts da série CodeIgniter Framework

É formado em Sistemas de Informação, pós-graduado em Sistemas de Banco de Dados e mestre em Educação com foco em Tecnologias Sociocomunitárias. Trabalha como professor de ensino técnico e tecnológico no Instituto Federal de Educação, Ciência e Tecnologia de São Paulo ministrando disciplinas nas áreas de programação, banco de dados, desenvolvimento de projetos e engenharia de software.

Posts relacionados

Comentários

  1. Boa tarde Rafael, obrigado por compartilhar, muito interessante a matéria.

    Eu faço isto de uma forma um pouco diferente, ao invés de criar uma classe model com o CRUD básico para cada uma das tabelas do meu banco, eu crio um “Generic_model”, o qual terá o CRUD, já as operações particulares de cada tabela eu faço em uma classe separada.

    Como a única coisa que mudará de um select para outro é o parâmetro “table”, eu crio um método que receberá esta informação, fará as ações básicas e retornará o resultado. Desta forma é muito menos trabalho e linhas de códigos, visto que as principais ações estarão num local só.

    1. Olá Rhino,

      Essa série de posts sobre CodeIgniter estou abordando o framework de forma natural. Sem criar extensões ou alterar códigos. Logo, eu uso o próprio Model (genérico) do CI.

      Essa sua recomendação é bastante válida e economiza uma série de métodos. Obrigado por compartilhar sua opinião.

      Abs!

  2. Olá Amigo,

    Estava feito um doido catando algum site que explicasse bem a forma de trabalhar com o CodeIgniter.

    Sou novo nesta questão de Framework e seu website é o Único com informações precisas e códigos 100% corretos sem ter de depender da intuição do leitor para saber como funciona.

    Espero que continue essa série de posts a respeito do CodeIgniter pois gostei muito do que vi até aqui.

  3. Olá Rafael Wendel!
    Primeiramente gostaria de parabenizar a iniciativa de compartilhar o seu conhecimento com a comunidade. Venho buscando ao máximo conhecer todas as possibilidades de uso para o CI, mas enfrento desafios relacionados à mudança brusca e necessária de largar a programação estruturada e aprender PHP orientado e MVC, associando isso ao CI.

    Bom… Em meus estudos eu resolvi refazer todo um sistema que havia desenvolvido em 2004, onde eu fazia uma busca por produtos considerando as opções selecionadas pelo usuário em 5 parâmetros (código do produto, disponibilidade no estoque, cor, tamanho e categoria). Em uma query básica em modelagem estruturada não há problemas, porém não consigo fazer essa lógica funcionar no CI. Poderia sugerir uma solução baseada no CI?

    1. Cara, também passei por este problema, porém meu sistema era local. Não havia perfis de usuário, e só tinha q me preocupar com o paradigma Entrada->processamento->saida.
      A verdade é que este modo de pensar só levando em consideração o problema já era.
      Hoje as coisas estão mais complexas, tem q pensar como usuário do sistema, antes de pensar no problema em si.
      Eu começaria, esquecendo paradigma E->P->S, e, como se estivesse entrando nisto a primeira vez e estudaria orientação a objetos do zero, entender isto é primordial pra enxergar o que está exposto aqui neste artigo claramente.
      É o q eu faria se fosse vc. Mas não sou você 🙂 então a decisão é sua. Boa Sorte.

      Conceitos do codeigniter:
      O MVC é um jeito brilhante de separar os dados(Model) da implementação(Controller) do carregamento deles pela visão(View).
      Os Models representam as tabelas, as Views representam o conteúdo das tabelas pela sua exibição e os Controllers são a implementação dos métodos pegam estes dados e passam para as views. Levei bons anos fazendo isto, mas um dia após tanta insistência estes conceitos ficam claros.

  4. Oi,
    Como faço para exibir ou ocultar aquela barra que aparece no topo das listas de dados, que tem um combo para selecionar a quantidade de registros por páginas e um campo para pesquisar por registros dinamicamente?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *