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 e pós-graduado em Sistemas de Banco de Dados. 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.

8 comentários

  1. Rhino

    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ó.

  2. Rodrigo Tavares Ferreira

    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. janete clara

    muito boa a explicação parabens!

  4. CodeIgniter - Models (Parte III) - Consultas Complexas | rafaelWendel

    […] Depois de um período sem conteúdo novo, hoje consegui um “tempinho” para escrever mais um post da série “CodeIgniter Framework”. Para acompanhar o post, recomendo fortemente, para aqueles que ainda não o fizeram, que olhem os posts anteriores sobre CI, principalmente aqueles que falam sobre a implementação de “models” no framework (CodeIgniter – Models (Parte I) e CodeIgniter – Models (Parte II). […]

  5. CodeIgniter - Views | rafaelWendel

    […] CodeIgniter – Models (Parte II) […]

  6. Peterson Souza

    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?

Deixar um comentário