Laravel incluye un ORM llamado Eloquent, el cual nos permite abstraer aún más las operaciones de base de datos, puesto que podemos interactuar con «Modelos» (representados por clases y objetos de PHP) en vez de tener que escribir sentencias SQL manualmente. En esta lección generaremos nuestro primer modelo de Eloquent y veremos cómo podemos crear y obtener registros usando este ORM.
Esta lección incluye un video premium
Regístrate para ver este video y cientos de lecciones exclusivas.
Mira el código en GitHub: actual, resultado, comparación.
Comencemos generando un modelo con el comando:
# php artisan make:model Note
Por defecto Laravel genera esta clase en el directorio app/
de nuestra aplicación. También podríamos ubicar los modelos dentro de un subdirectorio como app/Models
por ejemplo:
# php artisan make:model Models/Note
Pero utilicemos el modelo que se creó en el directorio app/
y eliminemos el otro para evitar confusión.
Crear registros utilizando Eloquent ORM
Regresemos a database/seeds/NoteSeeder.php
, reemplacemos los llamado a:
<?php DB::table('notes')->insert([ /**/ ]);
Por:
<?php App\Note::create([ /**/ ]);
Alternativamente podemos importar la clase al principio del archivo:
<?php use App\Note;
Para luego poder utilizarla sin necesidad de hacer referencia a su nombre de espacio completo:
<?php Note::create([ /**/ ]);
Al ejecutar php artisan migrate:fresh --seed
y revisar la base de datos, podremos comprobar que hemos obtenido el mismo resultado que antes.
Laravel provee un mecanismo de protección ante asignación masiva, es decir, asignación de múltiples atributos por medio de un arreglo; sin embargo, esta protección está desactivada dentro de los seeders y la veremos luego, cuando trabajemos en el formulario para crear notas.
Obtener registros utilizando Eloquent ORM
De vuelta a routes/web.php
podemos obtener las notas de una forma aún más simple:
<?php // No olvides importar el modelo al principio del archivo. use App\Note; // Ahora dentro de tus rutas puedes utilizar: // Para obtener todas las notas de la tabla notes $notes = Note::all(); // Para obtener la nota que corresponda con el ID dado // (o null si no es encontrada). $note = Note::find($id);
Convenciones de nombres de modelos y tablas
Eloquent utiliza una serie de convenciones para ahorrarnos el esfuerzo de tener que especificar cada nombre de tabla, llaves primarias o foráneas, etc.
La convención para el nombre del modelo es que cada palabra comience con una letra mayúscula y el nombre del modelo esté en singular, por ejemplo «Note» o «NoteCategory».
La convención para los nombres de las tablas es colocarlas en plural, todo en minúsculas y cada palabra dividida por un guión bajo, por ejemplo «notes» o «note_categories». (Nota que en inglés solo se pluraliza la última palabra).
Por supuesto si tus tablas y/o modelos no siguen estas convenciones, puedes definir el nombre de la tabla manualmente desde el modelo:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Note extends Model { protected $table = 'notes'; }
Eloquent y el constructor de consultas
Una ventaja adicional del ORM Eloquent es que -partiendo de cualquier modelo- podemos comenzar a construir consultas como aprendimos en la lección anterior, por ejemplo:
<?php // Puedes escribir: Note::where('id', $id)->first(); // En vez de: DB::table('notes')->where('id', $id)->first();
El resultado será similar en ambos casos, sin embargo, al trabajar con un modelo, los objetos retornados serán instancias de dicho modelo en vez de instancias de la clase genérica de PHP. Podemos comprobar esto utilizando Tinker.
Utilizando Tinker, la consola interactiva de Laravel
Vamos a conectarnos a Tinker ejecutando el siguiente comando desde el directorio principal del proyecto:
# php artisan tinker
Ahora estamos dentro de la consola interactiva, podemos salir con exit
y volver a entrar con php artisan tinker
, de hecho, esto es necesario si hacemos cambios en el código y queremos probarlos.
Desde aquí vamos a obtener registros usando el constructor de consultas y Eloquent como ya hemos aprendido:
<?php DB::table('notes')->get(); // Devuelve Illuminate\Support\Collection // y cada registro es una instancia de la clase genérica de PHP App\Note::all(); // Devuelve Illuminate\Database\Eloquent\Collection // y cada registro es una instancia de la clase App\Note DB::table('notes')->first(); // Devuelve un objeto de la clase genérica de PHP App\Note::first(); // Devuelve un objeto de la clase App\Note
De esta manera comprobamos que con Eloquent obtenemos un modelo, no un objeto genérico, y esto trae muchos beneficios como veremos a partir de la lección siguiente.
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Obtener registros de la base de datos con Laravel Lección siguiente Creación de registros con Laravel 6