Como en cualquier framework MVC, los modelos son otra de las capas del MVC y es la capa que permite conectarse a la base de datos. Un modelo se utiliza para interactuar con la base de datos y realizar operaciones de gestión sobre la misma, es decir, crear, actualizar, eliminar y obtener detalles de registros, cada modelos esta atado a una tabla en la base de dato, los modelos son la única forma de acceso a la base de datos.
Para crear un modelo en CodeIgniter 4, se puede utilizar el CLI con el siguiente comando:
$ php spark make:model NombreDelModelo
Este comando creará una nueva clase para el modelo en app/Models. También puede indicar propiedades para personalizar la conexión como el nombre de la PK, tabla, funciones personalizadas y un largo etc.
Una vez que se ha creado un modelo, se puede utilizar en un controlador o en cualquier otro lugar de la aplicación para interactuar con la base de datos.
Funciones claves en los modelos
Aparte de las operaciones que ya hemos realizado, hay muchas combinaciones que puedes realizar según tus necesidades; veamos algunas que podemos realizar en CodeIgniter 4.
Joins:
Los joins se emplean para combinar resultados entre distintas tablas buscando por el campo relacional; en CodeIgniter tenemos distintos tipos de joins (left, right, inner…) al igual que tenemos en SQL; como primer parámetro de la función join() pasamos la tabla a relacionar, y como siguiente parámetro, la igualdad.
$peliculaModel->asObject()
->select('peliculas.*, categorias.titulo as categoria')
->join('categorias, 'categorias.id = peliculas.categoria_id')
->find()
Paginados:
Esta función también puede ser simulada en SQL, aunque en CodeIgniter vamos un paso más allá; más adelante veremos cómo emplear esta función en detalle; pero en esencia es emplear la función de paginate() indicando el como parámetro el nivel de paginado.
$peliculaModel->asObject()
->select('peliculas.*, categorias.titulo as categoria')
->join('categorias, 'categorias.id = peliculas.categoria_id')
->paginate(10)
Condiciones where:
Los wheres son fundamentales en la mayoría de las consultas que realizamos y por ende los tienes que tener presentes; recibe dos parámetros que corresponden a la columna a comparar y su valor.
$peliculaModel->asObject()
->select('peliculas.*, categorias.titulo as categoria')
->join('categorias, 'categorias.id = peliculas.categoria_id')
->where('categorias.id', $categoria_id')
->find()
Anidados con condiciones orWhere:
Similar al caso anterior, pero aplicando las condiciones or en vez de la de where:
$usuarioModel->orWhere('email', $email)->orWhere('usuario', $usuario)->first();
Condiciones Like:
Los like son muy usados cuando estamos realizando búsquedas parciales; su uso es similar a de los where:
$peliculaModel->asObject()
->select('peliculas.*, categorias.titulo as categoria')
->join('categorias, 'categorias.id = peliculas.categoria_id')
->like('peliculas.titulo', $buscar)
->find()
Agrupadas:
En este ejemplo vemos cómo usar la función de groupBy para agrupar por campos similares; (según la versión de MySQL que estés empleando pueda que los campos a agrupar tengan que coincidir con las columnas especificadas en el select) cuya función en CodeIgniter te permite devolver justamente las columnas que especifiques, indicando alias en el proceso.
$peliculaModel->asObject()
->select('peliculas.*, categorias.titulo as categoria')
->join('categorias, 'categorias.id = peliculas.categoria_id')
->join('imagenes', 'peliculas.id = pelicula_id', 'left')
->groupBy('peliculas.id');
->find()
Ver query compilado:
Finalmente, cuando estés armando tus consultas, muchas veces quieres ver el SQL generado para saber exactamente cómo estas armando la consulta, ya que, con la estructura en base a funciones para crear un query, muchas veces no queda del todo claro.
Para ver el query, necesitamos obtener una instancia de la clase 'Query Builder de CodeIgniter' con la cual, tenemos una instancia genérica para conectarnos a cualquier tabla sin emplear un modelo:
$db = \Config\Database::connect();
$builder = $db->table('peliculas');
Con el query, en vez de emplear funciones finales como get() o first() empleamos la función de getCompiledSelect() en su lugar:
return $builder->limit(10, 20)->getCompiledSelect();
Y obtenemos:
SELECT * FROM `peliculas` LIMIT 20, 10
Lo más importante es notar que existen equivalencias entre los tipos de consulta que podemos usar en SQL, con un conjunto de funciones que tenemos en CodeIgniter; estas funciones se aprenden con la práctica, conocer cuáles parámetros debes pasar, cuales son opcionales como los puedes personalizar.
Este material forma parte de mi curso y libro completo sobre CodeIgniter 4.
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter