> Manuales > Manual de Laravel

Qué son los modelos, clases fundamentales en el patrón MVC implementado por el framework Laravel. Cómo crear y configurar los modelos, cómo nos permiten el acceso de manera sencilla a los datos de las aplicaciones.

Siguiendo con una introducción básica a los componentes principales de Laravel, queremos hacer una primera aproximación a los modelos, de los que no habíamos hablado todavía en el Manual de Laravel. Pero antes que nada, conviene hacer una aclaración conceptual sobre qué es un modelo:

Los modelos son uno de los componentes principales de las aplicaciones desarrolladas bajo el patrón MVC, que tienen la responsabilidad de acceder a los datos, modificarlos, etc. En el patrón además los modelos mantienen lo que se llama la lógica de negocio, que son las reglas que deben cumplirse para trabajar con los datos.

Por tanto, el tipo de acciones que le vamos a solicitar a un modelo es por ejemplo, obtener datos, insertarlos, modificarlos, etc. En las operaciones que modifiquen los datos además se tendrá que realizar cierta validación de esos datos, para asegurarnos que tienen la forma que es necesaria antes de guardarlos.

Cuando pensamos en modelos muchos hacemos una conexión directa con la base de datos: "un modelo guarda el código de acceso a la base de datos". Pero no es exactamente así, ya que un modelo trabaja con datos que pueden venir de varias fuentes. Generalmente será la base de datos, pero podría ser un API, Servicio web, sistema de archivos, etc.

Modelos en Laravel

Antes de comenzar, para quienes ya tienen conocimientos de separación del código por capas "Modelo, Vista Controlador", es importante mencionar que Laravel separa código que en el patrón MVC se ubica en la responsabilidad del modelo en diversas clases que encontraremos por distintos directorios. Más bien, lo que nos ofrecen los modelos es el trabajo con lo que sería el ORM Eloquent, de modo que nuestros modelos definirán los objetos de cada una de las entidades de la aplicación, junto con sus funcionalidades básicas.

En Laravel los modelos se gestionan en la carpeta "app", colocando los archivos de nuestro modelo sueltos ahí. Esta localización puede cambiar, y de hecho es distinta en las aplicaciones Laravel en la versión 9, dado que se localizaron en la carpeta Models. De modo que en las nuevas instalaciones de Laravel la ruta de los modelos estará en ```app/Models```.

Nota: Una de las modificaciones principales que aparecieron en la versión 5 de Laravel es que quitaron la carpeta de los modelos. Esto es porque te animaban a que usases la estructura de carpetas que prefieras para los modelos. De hecho eso es perfectamente posible y los modelos en principio pueden ir todos colgando de la carpeta "app", pero también podría crearse una carpeta "Models" para situarlos allí, o crear cualquier otra estructura si lo ves conveniente.

Más adelante, en Laravel 9 volvieron a crear la carpeta "Models" para colocar los modelos de la aplicación, pues los desarrolladores de Laravel insistieron mucho en que el framework los localizase de manera predeterminada allí.

En la instalación limpia de Laravel 5.1 tenemos un primer modelo que podemos abrir para echar un primer vistazo rápido sobre ellos. Es el archivo que está en la ruta "app/User.php".

Actualmente no encontrarás el modelo User.php en una instalación limpia de Laravel, ya que estos archivos del proceso de login solo están disponibles si instalas adicionalmente los starter kits Breeze o Jetstream.

Como puedes ver, los modelos tienen la primera letra en mayúscula, por implementarse mediante clases. Los archivos donde guardamos el código de los modelos también deben tener esa primera letra en mayúscula.

En Laravel los modelos se controlan por un ORM llamado Eloquent, al menos los modelos que están implementados como datos en una base de datos, pero no es un requisito, de modo que podríamos trabajar con otros ORM o incluso bajar a un nivel más bajo y trabajar con Query Builder o PDO directamente, o con las extensiones de nuestra base de datos en particular, lo que no sería muy recomendable en realidad.

En el caso de ser un modelo Eloquent, los modelos están directamente asociados a una entidad y a su vez a una tabla de la base de datos, por lo que un modelo que se llama User está directamente relacionado con una tabla llamada con el mismo nombre en la base de datos, pero en minúscula y acabado en plural, ej "users".

Como siempre, te recomendamos comenzar por abrir el mencionado archivo con el modelo User.php para ver cómo se implementan en Laravel. Ese modelo está bien pero tiene un par de modificaciones un poco avanzadas que nos pueden despistar, así que preferimos explicarte los modelos con respecto a un ejemplo más vacío.

Crear un modelo vacío en Laravel

Como en otras ocasiones, podemos ayudarnos de artisan para crear un modelo de partida. Con el comando make:model, seguido del nombre del nuevo modelo, creamos un modelo vacío.

php artisan make:model Article

Eso nos crea en el directorio "app" el correspondiente modelo de Eloquent, que contiene un código como el que puedes ver a continuación.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    //
}

Eso es todo lo que necesita un modelo básico en Laravel. Como te puedes imaginar, la explicación de su sencillez es que esta clase extiende la clase Model de Laravel.

Estos modelos ya vienen con funcionalidades para solicitar datos que estén en la base de datos. Los modelos de Eloquent estarán asociados directamente con una tabla llamada "articles", sin que tengamos que configurar nada en nuestro código, aunque más adelante aprenderemos a cambiar el nombre de la tabla asociada a un modelo, por si nos resultase necesario.

Este modelo usará el motor del ORM de Eloquent y lo puedes ver porque está haciendo uso de la clase Model que está en el namespace Illuminate\Database\Eloquent. Esa clase se le asigna un alias llamado "Model" (el mismo nombre de la clase que luego hacemos el extends) gracias a la sentencia:

use Illuminate\Database\Eloquent\Model;
Nota: Si nuestro modelo trabajase con otro ORM, o con otra base de datos que no soporte Eloquent como MondoDB, no usaríamos esa clase Model para extenderlo, sino otra, y por tanto el trabajo sería diferente al que realizamos con Eloquent.

Fíjate también que el modelo se crea dentro del namespace "App", definido por la primera línea de código:

namespace App;

Acceder a datos del modelo

Desde los controladores querremos acceder a datos que mantienen los modelos: consultas, modificaciones, etc. Esas operaciones se hacen a través de la clase del modelo que acabamos de implementar.

De momento veamos cómo implementar una selección de todos los datos que tenemos en el modelo, invocando el método all() sobre el modelo que acabamos de crear.

\App\Article::all()

Este código estaría en un controlador, o en otra clase desde la que queramos acceder a los datos del modelo. Como puedes ver, para referirnos al modelo debemos indicar el espacio de nombres donde lo podemos encontrar, que en nuestro caso era "App".

Esa línea de código, como decíamos, nos devuelve una colección con los datos encontrados. Aunque de momento todavía no nos va a funcionar, porque la tabla "articles" no está creada en nuestro sistema gestor. En cambio obtendremos un error como este: "[...] Base table or view not found: 1146 Table 'proyecto.articles' [...]".

En futuros artículos veremos cómo crear nuestras tablas, con el sistema de migraciones y podremos comenzar a usar más a fondo los modelos. Pero como seguro estamos impacientes por comprobar si esa instrucción verdaderamente funciona, vamos a adelantar alguna cosa.

Crear una tabla manualmente de MySQL

Podemos crear manualmente la tabla que estamos necesitando en la base de datos. Como decimos, no sería el modo correcto de proceder pero de momento con lo que sabemos vamos a conformarnos. Usaremos nuestro cliente MySQL de preferencia, como MySQL Workbench, Sequel Pro o incluso podríamos instalar PhpMyAdmin. Nosotros no vamos a usar ninguna de esas posibilidades, sino que vamos a conectar MySQL por línea de comandos, que así no hay manera de fallar.

A continuación realizaremos una pequeña recetilla para crear esa tabla, que nos servirá para explicar el proceso.

  1. Primero arrancamos la máquina virtual, si no estaba ya: (desde el directorio de homestead en tu disco local)

    vagrant up
  2. Conectas por SSH con la máquina Homestead.

    vagrant ssh
  3. Conectas con MySQL por línea de comandos. El host es "localhost", el usuario es "homestead" y la clave es "secret".

    mysql -h localhost -u homestead -p
    Nota: Puedes mirar el usuario y contraseña de la base de datos en el archivo .env que está en la raíz del proyecto. Otras configuraciones de bases de datos, como el sistema gestor de base de datos usado se indican en archivo config/database.php. Por defecto Laravel en Homestead viene configurado para usar MySQL, pero hay otros motores de base de datos que se encuentran instalados en la máquina virtual.
  4. Ya dentro del cliente MySQL por línea de comandos lanzas el comando para usar la base de datos que tengas creada.

    use homestead;


  5. Ahora creas la tabla y los datos de prueba.

    CREATE TABLE `articles` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    INSERT INTO `articles` (`id`, `name`)
    VALUES
    	(1,'Probando'),
    	(2,'Algo'),
    	(3,'Lindo');
    

Teóricamente ahora ya podrás acceder a la página de antes, donde habías puesto en el controlador la instrucción para mostrar todos los artículos. Solo recuerda que para mostrar la salida por la página y así poder leerla debes hacer un print_r() o var_dump() porque es una colección. También puedes usar la función dd() que te ofrece Laravel.

dd(\App\Article::all());
Nota: Realmente no necesitas ni usar un controlador, podrías hacerlo directamente con una closure dentro del sistema de rutas.

Route::get('articulos', function(){
	dd(\App\Article::all());
});

Conclusión

Insistimos en que más adelante vamos a conocer mecanismos por los que se crean las tablas o se insertan datos de prueba directamente desde Laravel, cuando hablemos de "migrations y seeders". Aunque para trabajar en Laravel podríamos tener el schema de la base de datos hecho a mano directamente con SQL en el gestor de base de datos que estemos usando, no es la manera más habitual de proceder.

Además, hay otros métodos de acceder al sistema gestor de base de datos, como ya hemos advertido, con programas profesionales como MySQL Workbench que dan muchas mejores prestaciones y aumentan la productividad, en comparación con trabajar directamente por el terminal.

De momento creemos que es suficiente para cumplir con lo que sabemos nuestro objetivo de poner en marcha esa llamada al modelo y recuperar información que hay en MySQL.

Carlos Ruiz Ruso

Consultor tecnológico para el desarrollo de proyectos online especializado en Wo...

Manual