Los Modelos

Los modelos están disponibles opcionalmente para aquellos que quieran usar un enfoque MVC más tradicional.

Qué es un modelo?

Los modelos son clases PHP que están diseñadas para trabajar con información en la Base de datos, por ejemplo, supongamos que usas CodeIgniter para administrar un blog, es posible que tengas una clase de modelo que contenga funciones para insertar, actualizar y recuperar los datos de tu blog.

Aquí hay un ejemplo de cómo podría ser una clase de modelo así:

class Blog_model extends CI_Model {
    public $título;
    public $contenido;
    public $fecha;

    public function get_ultimas_diez_entradas()
    {
        $query = $this->db->get('entradas', 10);
        return $query->result();
    }

    public function insertar_entrada()
    {
        $this->título = $_POST['título']; //por favor leer la nota de abajo
        $this->contenido = $_POST['contenido'];
        $this->fecha = time();
        $this->db->insert('entradas', $this);
    }

    public function update_entry()
    {
        $this->título = $_POST['título'];
        $this->contenido = $_POST['contenido'];
        $this->fecha = time();
        $this->db->update('entradas', $this, array('id' => $_POST['id']));
    }
}

Nota

Los métodos en el ejemplo anterior usan los métodos de Base de datos del Query Builder

Nota

En aras de la simplicidad, en este ejemplo estamos usando $_POST directamente, en general, esto es una mala práctica, y un enfoque más común sería usar la biblioteca de entrada Input Library: $this->input->post('título')

Anatomía de un modelo

Las clases de modelo se almacenan en el directorio application/models/, se pueden anidar dentro de subdirectorios si desea este tipo de organización.

El prototipo básico para una clase modelo es este:

class Nombre_modelo extends CI_Model {
}

Donde Nombre_modelo es el nombre de su clase, los nombres de clase deben tener la primera letra en mayúscula y el resto del nombre en minúscula y asegúrate de que la clase 'extends' de la clase de modelo base.

El nombre del archivo debe coincidir con el nombre de la clase, por ejemplo, si esta es su clase:

class Usuario_model extends CI_Model {
}

Su archivo será este:

application/models/Usuario_model.php

Cargar un modelo

Los modelos generalmente se cargan y se llamán desde los métodos del controlador. Para cargar un modelo, usará el siguiente método:

$this->load->model('nombre_modelo');

Si el modelo está ubicado en un subdirectorio, se debe incluir la ruta relativa desde su directorio de modelos, por ejemplo, si tienes un modelo ubicado en application/models/blog/Consultas.php, lo cargarás usando:

$this->load->model('blog/consultas');

Una vez cargado, accederás a los métodos del modelo utilizando un objeto con el mismo nombre que su clase:

$this->load->model('nombre_modelo');
$this->nombre_modelo->método();

Si deseas que el modelo se asigne a un nombre de objeto diferente, puedes especificarlo mediante el segundo parámetro del método de carga:

$this->load->model('nombre_modelo', 'foobar');
$this->foobar->método();

Aquí hay un ejemplo de un controlador que carga un modelo y luego sirve una vista:

class Blog_controller extends CI_Controller {
    public function blog()
    {
        $this->load->model('blog');
        $datos['consulta'] = $this->blog->get_ultimas_diez_entradas();
        $this->load->view('blog', $datos);
    }
}

Cargar un modelo automáticamente

Si encuentras que necesitas tener un modelo globalmente en tu aplicación, puede indicarle a CodeIgniter que realice la carga automáticamente durante la inicialización del sistema. Esto lo puedes hacer abriendo el archivo application/config/autoload.php y agregando el modelo al array de autocarga.

Conectar a la Base de datos

Cuando se carga un modelo, este NO se conecta automáticamente a la Base de datos. A continuación te muestro las opciones que tenemos para conectarnos a la base de datos:

  • Podemos conectarnos utilizando los métodos de Base de datos estándar que se describen aquí, ya sea desde la clase de controlador o la clase de modelo.

  • Podemos indicarle al método de carga del modelo que se conecte automáticamente pasando TRUE a través del tercer parámetro, y se usarán las configuraciones de conectividad, como se define en el archivo de configuración de la Base de datos:

$this->load->model('nombre_modelo', '', TRUE);
  • O finalmente, podemos pasar manualmente la configuración de conectividad de la Base de datos a través del tercer parámetro:
$config['hostname'] = 'localhost';
$config['username'] = 'mi_nombre_de_usuario';
$config['password'] = 'mi_contraseña';
$config['database'] = 'mi_base_de_datos';
$config['dbdriver'] = 'mysqli';
$config['dbprefix'] = '';
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;

$this->load->model('nombre_modelo', '', $config);