Models no CodeIgniter

29 de março de 2010, em Passos Iniciais, por

Models no CodeIgniter

Já vimos que Controllers no CodeIgniter são responsáveis por controlar o fluxo dos programas, que contêm as regras de negócio. Já no artigo sobre MVC, também vimos que Models no CodeIgniter são responsáveis pelas quais o CRUD acontece, ou seja, sempre que dados forem criados, selecionados, atualizados ou deletados, seja num banco de dados, arquivo XML ou onde quer que estes dados estejam armazenados, então é com o Modelque temos que trabalhar.

Models do CodeIgniter

É possível, sim, desenvolver sites com CodeIgniter trabalhando somente com Controllers e Views; entretanto, este seria um uso “castrado” do framework, já que muito de seu poder reside na capacidade de abstração e tratamento de informações vindas de bancos de dados. Explicava a devida importância dos Models no CodeIgniter, vamos aprender um pouco mais a respeito.

Ao limitarmos nosso desenvolvimento a somente projetos “estáticos”, sem o poderoso recurso de armazenagem de dados, na verdade não conseguiremos desenvolver grandes feitos quando o assunto é internet. Realmente existem nichos de atuação para captação de recursos que dispensam uso de BDs, mas o foco de atuação deste blog não é este.

Então, regra geral, sempre que pensarmos em CodeIgniter, devemos pensar em uso de bancos de dados para armazenagem das informações, seja na feitura de um blog, site, e-commerce ou qualquer outro sistema online.

Foi visto no artigo sobre MVC que os Models possuem as seguintes características principais:

  • Encapsula o estado da aplicação;
  • Realiza e responde a consultas no banco de dados.

Estrutura de um Model no CodeIgniter

Models no CodeIgniter ficam armazenados em application/models, aceitando, também, estruturação em subdiretórios, caso seja preciso.

Assim como todo framework, o CodeIgniter possui suas regras de sintaxe, ou seja, a maneira pela qual os códigos devem ser escritos. A estrutura básica de um model no CodeIgniter (para fins didáticos, “Blog”) é a seguinte:

1
2
3
4
5
6
class Blog extends CI_Model {
    function __construct()
    {
        parent::__construct();
    }
}

E, a partir dessa estrutura-modelo, deduz-se as seguintes regras de sintaxe:

  • Nomes de classes de models devem ter a primeira letra em maiúsculo;
  • Nomes de classes de models, com exceção da primeira letra, devem ser em minúsculo;
  • Os models devem extender a classe base “Model” através de uma função com mesmo nome da classe;
  • O arquivo da classe deve ter o mesmo nome da classe em minúsculo (ex., application/models/blog.php).

Carregando um Model

Para prosseguir a leitura você precisa das informações contidas no artigo sobre Controllers no CodeIgniter. Se ainda não leu, acesse o artigo, leia e depois volte.

Comumente, models são carregados a partir de funções nos controllers do software. Genericamente, um model é carregado através da seguinte função:

1
2
3
 // se o arquivo do model estiver em subdiretório,
 // basta indicar o caminho no parâmetro
$this->load->model('Model');

Depois de carregado o model, suas funções são acessadas a partir da seguinte sintaxe:

1
$this->Model->function();

Opcionalmente, é possível especificar um “apelido” para um model, apelido este que, se especificado será usado para a chamada das funções:

1
2
$this->load->model('Model', 'apelido');
$this->apelido->function();

Carregar models automaticamente (auto-loading Models)

É bastante comum um model ser tão útil ao ponto de precisar ser usado em praticamente toda uma aplicação. Para esses e outros casos, o CodeIgniter permite que um ou mais models sejam carregados automaticamente, juntamente com a inicialização do sistema.

Para carregar models automaticamente, abra o arquivo application/config/autoload.php, procure a seção “Auto-load Models” e especifique no array qual(is) model(s) você deseja que sejam carregados automaticamente. Por exemplo:

1
$autoload['model'] = array('blog', 'forum', 'chat');

Conectando ao Banco de Dados

Quando um model é carregado, não há conexão automática ao banco de dados. Isso é algo que deve ficar bem claro, pois gera enorme dúvida e, se não observado, pode parecer que está acontecendo um erro na lógica do programa – consequentemente, tem o potencial de fazer você desperdiçar horas de esforço atrás de um erro inexistente…

Existem diversos métodos de conexão ao banco de dados; para o momento, saiba que, para se conectar ao banco de dados de sua aplicação, você deve passar um parâmetro à função de carregamento do model. Fica assim:

1
$this->load->model('Model', '', TRUE); // parâmetro vazio é o "apelido"

Esse terceiro parâmetro indica que a conexão ao banco de dados deve ser feita utilizando as informações de BD contidas no arquivo application/config/database.php. Isso é o mais comum e prático de ser feito. Entretanto, há casos ou pode ser de sua preferência, especificar, no próprio controller, quais as informações necessárias para a conexão.

Nesse caso, ao invés de “TRUE”, o último parâmetro conterá o array (com nome de sua preferência) com esses dados:

1
2
3
4
5
6
7
8
9
10
11
// Os parâmetros mais "incomuns" serão explicados em artigos futuros
$config['hostname'] = 'localhost';
$config['username'] = 'username';
$config['password'] = 'password';
$config['database'] = 'database';
$config['dbdriver'] = 'mysql';
$config['dbprefix'] = '';
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;
 
$this->load->model('Model', '', $config);

No próximo artigo serão explicados os diversos meios de o CodeIgniter se conectar a um (ou mais de um) bancos de dados. Não percam! ;-)

11 comentários em "Models no CodeIgniter"

gravatar

Jackson Jorge  em 5 de abril de 2010

Tárcio, parabéns pelos artigos, realmente nos ajudam muito, lí quase todos. Agora quanto ao CI, eu realmente estou com bastante dificuldades e espero o mais rápido possível estar familiarizado com isso.

Eu não estava acostumado com Frameworks, meus projetos eu criava tudo da maneira antiga onde a lógica e programação vai correndo por todo o arquivo até o final, mas resolvi mudar para facilitar a manutenção de alguns projetos grandes que tenho desenvolvido.

A minha maior dificuldade tem sido em coletar esses dados no banco e repassá-los para views. Será que você não conseguiria montar um artigo com exemplo prático com consulta em um banco de dados e exibição e manutenção desses dados (CRUD), pode usar o exemplo de uma agenda de contatos ou algo do tipo, só para entender as funcionálidades o CRUD dentro do CI.

Fico aguarndando e novamente Parabéns pelo site, está show de bola!

gravatar

Tárcio Zemel  em 7 de abril de 2010

@ Jackson Jorge
Jackson, muito obrigado pela força! Seus elogios mostram que o conteúdo está bom e que a sequência lógica está sendo feita de maneira correta.

Inclusive, um dos próximos artigos será como “juntar” o MVC para coletar dados do BD e exibir em uma view depois de tratamento. Aguarde só mais um pouquinho! :-)

Como ainda estamos em um nível de explicações iniciais, criar aplicativos completos, como Agenda, ainda não irá acontecer, mas fique ligado no CodeIgniter Brasil que, com certeza, projetos do tipo serão explicados!

Obrigado por comentar e aguardo sua presença nos próximos artigos! Att

gravatar

Tárcio Zemel  em 17 de junho de 2011

Olá, Henrique! Como vai?

Rapaz, você está mais do que certo. Por enquanto, ainda não há artigo explicando como inserir no BD ou fazer outras operações. Mas acontece que por aqui é o "bloco do eu sozinho", então não insiro tantos artigos quanto gostaria, nem com a frequência que gostaria…

Mas, tenha certeza, estão para sair artigos que explicarão isso e muito mais. Assine o feed do CodeIgniter Brasil para acompanhar.

Abraços!

gravatar

mauricio  em 20 de setembro de 2011

Tárcio, voce pode dar um exemplo de como usar a função $this->db->select_sum(), seleciona coluna de uma tabela do BD, do tipo decimal p/exemplo no mysql, e soma os valores desta coluna, mas eu não consigo exibir o resultado na tela…

gravatar

mauricio  em 22 de setembro de 2011

deixa pra la, ja descobri, mas sem usar o select_sum() do codeigniter:
$query = "SELECT SUM(valor) FROM coluna WHERE…. ";
$soma = $this->db->query($query);
$resultado['soma'] = $soma->result_array();

foreach($soma as $num):
endforeach;
echo $num['SUM(valor)'];

Comente!