CodeIgniter – Models (Parte III) – Consultas Complexas

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

À seguir, vou mostrar para vocês como fazer consultas personalizadas, de forma estruturada e orientada à objetos, utilizando os recursos que o framework oferece.

No último post vimos como buscar (fazer um “select”) os dados dos produtos no banco de dados. Implementamos 2 métodos: 1 para buscar todos os produtos e outro para buscar um produto específico através de seu ID.

Pois bem. O objeto $this->db, que é herdado em nosso “Produto_model” fornece uma série de métodos interessantes para atividades triviais como inserção, atualização, exclusão e consultas genéricas. Mas ele oferece também outros recursos para que montemos consultas SQL mais personalizadas.

Por exemplo, imagine que você queira buscar nome e preço de todos os produtos que custam mais de 1000 reais.

1
2
3
4
5
$query = $this->db->select('nome, valor')
                  ->from('produto p')
                  ->where('p.valor > 1000')
                  ->get();
//Produz: SELECT nome, valor FROM produto p WHERE p.valor > 1000;

Veja que a consulta foi montada de forma orientada à objetos, de forma semântica (bem parecida com uma query SQL tradicional).

Imagine agora que a tabela “produto” do nosso banco fosse relacionada com uma tabela “categoria”, que informasse a categoria dos produtos. Como fazer uma consulta com JOIN?

1
2
3
4
5
6
//Buscar os produtos e suas respectivas categorias
$query = $this->db->select('*')
                  ->from('produto p')
                  ->join('categoria c', 'p.idcategoria = c.idcategoria')
                  ->get();
//Produz: SELECT * FROM produto p JOIN categoria c ON p.idcategoria = c.idcategoria;

No método join, no terceiro parâmetro você pode informar ‘left’ (LEFT JOIN) ou ‘right’ (RIGHT JOIN).

O método where pode ser chamado sempre que houver uma condição. Nesse caso, ele se baseia no operador lógico “AND”. Por exemplo:

1
2
3
4
5
6
7
//Buscar todos os produtos que custam entre 1000 e 2000 reais
$query = $this->db->select('*')
                  ->from('produto p')
                  ->where('p.valor > 1000')
                  ->where('p.valor < 2000')
                  ->get();
//Produz: SELECT * FROM produto p WHERE p.valor > 1000 AND p.valor < 2000;

Para usar o operador OR, utilize o método or_where().

1
2
3
4
5
6
7
//Buscar todos os produtos que são da categoria 1 ou da categoria 2
$query = $this->db->select('*')
                  ->from('produto p')
                  ->where('p.idcategoria = 1')
                  ->or_where('p.idcategoria = 2')
                  ->get();
//Produz: SELECT * FROM produto p WHERE p.idcategoria = 1 OR p.idcategoria = 2;

Existe uma gama muito grande de possibilidades (funções, agregação, ordenação, operadores, etc.) para se montar consultas extremamente complexas e personalizadas de acordo com as necessidades de cada model.

Recomendo uma olhada no Guia do Usuário do próprio CI (Clique aqui), na parte que fala sobre Active Record, para um aprendizado maior (e para o post não ficar gigante 😉 ).

No mais é só isso.

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. Olá Graças a Você conseguir entender bastante sobre o Framework. Muito Obrigado

    Estou com uma dúvida, no post Anterior a parte 2 vc mostrou como pegar os valores do banco
    consegui fazer tudo certo, menos quando eu pego uma imagem. Como eu faço para q ele retorne uma imagem ? Minha tabela está assim cd_img primary key auto_i, im_perfil blob
    o banco é o mysql. Me ajudaa

    agradeço desde já

  2. Show mas como eu faço uma consulta com variável, tipo ali no lugar do: ->where(‘p.valor > 1000’) aquele 1000 seja uma variável vinda do controller.

    1. Olá Juliano,

      Passe para o método o(s) parâmetro(s) que precisar:

      $query = $this->db->select('nome, valor')
                        ->from('produto p')
                        ->where('p.valor', $valor)
                        ->get();

      Abs!

Deixe um comentário

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