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.

7 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) […]

Deixar um comentário