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
- Introdução ao CodeIgniter Framework
- CodeIgniter – URLs
- CodeIgniter – Controllers
- CodeIgniter – Rotas
- CodeIgniter – Views
- CodeIgniter – Models (Parte I)
- CodeIgniter – Models (Parte II)
- CodeIgniter – Models (Parte III) – Consultas Complexas
Mandou bem… trabalhar com activerecord é bem melhor!
Cara como faço relacionamento manytoone?
tipo uma venda possui muitos produtos?
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á
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.
Olá Juliano,
Passe para o método o(s) parâmetro(s) que precisar:
Abs!
Cara parabéns pelas dicas, apliquei e ficou muito bom obrigado por postar!!!
Obrigado por ter tirado do seu precioso tempo para ajudar um desconhecido, que a vida de dê o melhor em todos seus dias.