Modelos y Eloquent ORM en Laravel 9, ¿Qué son?, ¿Para qué sirven?, ¿Qué es Eloquent ORM?
¡Hola!
En este artículo trataremos todos los temas relacionados con los Modelos y Eloquent ORM en Laravel 9
Laravel es un Framework PHP basado en la arquitectura MVC (Modelo - Vista - Controlador). Un modelo Laravel es una clase que consulta la base de datos. En lugar de escribir código individual (SQL) por consulta (CRUD), un modelo puede agrupar todo. Ese mismo modelo o clase se puede usar para realizar las operaciones CRUD normales en la base de datos.
Debido a que Laravel se envía con un ORM confiable(Eloquent ORM)*, trabajar con modelos en Laravel es muy fácil.
*Un ORM es un Mapeo-Objeto-Relacional que básicamente es una forma de mapear los datos que se encuentran en una base de datos en su lenguaje SQL a objetos de PHP y viceversa. Gracias a este ORM tenemos un código SQL portable sin tener que utilizar este lenguaje dentro de nuestras clases PHP
Índice
-
1. Creación y uso
de modelos en Laravel
- a. Crear Modelo básico en Laravel
- b. Crear Modelo y su migración
- c. Crear Modelo y Factory
- d. Crear Modelo y Seeder
- e. Crear Modelo y Controlador
- f. Crear Modelo y Policy
- g. Crear Modelo, Controlador, Resource Class y Form Requests
- h. Crear Modelo, Factory, Seeder y Controlador
- i. Crear Modelo, Migración , Factory, Seeder, Policy, Controlador y Form Requests
- j. Crear Modelo Pivot
- 2. Uso de Eloquent con Modelos en Laravel
Creación y uso de modelos en Laravel
Laravel hace uso de Modelos para recibir, enviar, guardar y eliminar información a la base de datos. Los modelos se ubican en la carpeta app/Models
.
Los Modelos hacen uso de PSR-4 y namespaces, estos modelos nos ayudan a definir la tabla, atributos que se pueden llenar(nombre de un usuario por ejemplo) y los atributos que deben mantenerse ocultos (por ejemplo contraseñas).
Los Modelos en Laravel usan convenciones para que a Laravel se le facilite el trabajo y nos ahorre tanto líneas de código como tiempo para relacionar más modelos. Las convenciones son las siguientes:
-
- El nombre de los modelos se escribe en singular, en contraste con las tablas de la base de datos que se escriben en plural
-
- Usan notación UpperCamelCase para sus nombres
Gracias a estas convenciones podemos detectar automáticamente las tablas, por ejemplo, el Modelo User se encuentra en singular y con notación UpperCamelCase y gracias a ello Laravel puede definir fácilmente que tabla es la que está ligada a este modelo mediante la conversión a notación underscore y plural es decir el resultado sería la tabla users.
Un ejemplo más complejo: si tenemos una tabla que se llama dieta_platos nuestro modelo se llamará DietaPlato
Crear Modelo básico en Laravel
Para crear un Modelo en Laravel abrimos un terminal en nuestro proyecto y ejecutamos el siguiente comando:
php artisan make:model NombreModelo
Si queremos crear un Modelo para la tabla productos:
php artisan make:model Producto
Así es como se ve nuestro modelo recien creado:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model;
class Producto extends Model { use HasFactory; }
Crear Modelo y su migración
Si queremos crear un Modelo y su correspondiente Migración para la base de datos tenemos que añadir -m
es decir:
php artisan make:model NombreModelo -m
Si queremos crear un Modelo y una tabla llamada productos:
php artisan make:model Producto -m
Crear Modelo y Factory
Si queremos crear un Modelo y su correspondiente Factory tenemos que añadir -f
o --factory
es decir:
// Forma larga
php artisan make:model NombreModelo --factory
// Forma corta
php artisan make:model NombreModelo -f
Si queremos crear un Modelo Producto y su Factory:
// Forma larga
php artisan make:model Producto --factory
// Forma corta
php artisan make:model Producto -f
Crear Modelo y Seeder
Si queremos crear un Modelo y su correspondiente Seeder para la base de datos tenemos que añadir -s
o --seeder
es decir:
// Forma larga
php artisan make:model NombreModelo --seeder
// Forma corta
php artisan make:model NombreModelo -s
Si queremos crear un Modelo Producto y su Seeder:
// Forma larga
php artisan make:model Producto --seeder
// Forma corta
php artisan make:model Producto -s
Crear Modelo y Controlador
Si queremos crear un Modelo y su correspondiente Controlador tenemos que añadir -c
o --controller
es decir:
// Forma larga
php artisan make:model NombreModelo --controller
// Forma corta
php artisan make:model NombreModelo -c
Si queremos crear un Modelo Producto y su Controlador:
// Forma larga
php artisan make:model Producto --controller
// Forma corta
php artisan make:model Producto -c
h3 id="crear-modelo-y-migracion" >Crear Modelo y Policy
Si queremos crear un Modelo y su correspondiente Policy tenemos que añadir --policy
es decir:
php artisan make:model NombreModelo --policy
Si queremos crear un Modelo Producto y su Policy
php artisan make:model Producto --policy
Crear Modelo, Controlador, Resource Class y Form Requests
Si queremos crear un Modelo y su correspondiente Resource class y Form Request tenemos que añadir --controller
--resource
--request
o -crR
es decir:
// Forma larga
php artisan make:model NombreModelo --controller --resource --request
// Forma corta
php artisan make:model NombreModelo -crR
Si queremos crear un Modelo Producto y su Controlador, Resource Class y Form Request
// Forma larga php artisan make:model Producto --controller --resource --request
// Forma corta php artisan make:model Producto -crR
Crear Modelo, Factory, Seeder y Controlador
Si queremos crear un Modelo y su correspondiente Factory, Seeder y Controlador tenemos que añadir -msfc
es decir:
php artisan make:model NombreModelo --msfc
Si queremos crear un Modelo Producto y su Factory, Seeder y Controlador
php artisan make:model Producto --msfc
Crear Modelo, Migración, Factory, Seeder, Policy, Controlador y Form Request
Existe una opción en la creación de modelos en Laravel que nos permite crear un modelo su Migración, Factory, Seeder, Policy, Controlador y Form Request para ello tenemos que añadir --all
php artisan make:model NombreModelo --all
Si queremos crear un Modelo Producto y su Migración,Factory, Seeder, Policy, Controlador y Form Request
php artisan make:model Producto --all
Crear Modelo Pivot
Si queremos crear un Modelo Pivot añadimos --pivot
php artisan make:model NombreModelo --pivot
Si queremos crear un Modelo Producto Pivot:
php artisan make:model Producto --pivot
Uso de Eloquent con Modelos en Laravel
Lo mejor de Eloquent ORM es la facilidad con la que puedes realizar operaciones CRUD en la base de datos.
Normalmente, Eloquent utiliza el nombre de la clase del modelo como nombre de la tabla. Sin embargo, también puedes definir el nombre de la tabla explícitamente definiendo una variable protegida $table
.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Producto extends Model
{
use HasFactory;
// En lugar de ser el modelo de la tabla "productos" será de la tabla "mis_productos"
protected $table = "mis_productos";
}
Por defecto Eloquent ORM asume que cada una de nuestras tablas tiene una clave primaria (primary_key) de nombre de columna "id" y de tipo autoincremental. Si queremos que nuestra clave primaria tenga otro nombre podemos establecero fácilmente mediante protected $primaryKey
. Esto anula la configuración de nuestra clave primaria por defecto. Además podemos quitar el tipo autoincremental fácilmente definiendo public $incrementing
como false
Siguiente nuestro ejemplo de Modelo Producto vamos a poner su clave primaria el campo "nuevo_producto_id" y vamos a quitar que se sea autoincremental
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Producto extends Model
{
use HasFactory;
// En lugar de ser el modelo de la tabla "productos" será de la tabla "mis_productos"
protected $table = "mis_productos";
// Cambiamos la clave primaria al campo "nuevo_producto_id"
protected $primaryKey = "nuevo_producto_id";
// Quitamos que sea autoincremental
public $incrementing = false;
}
Una vez hemos entendido lo que hace Eloquent ORM vamos crear un controlador ProductoController
y una vez creamos podremos entender las posibilidades de los Modelos con Eloquent ORM
<?php
namespace App\Http\Controllers;
use App\Models\Producto;
use Illuminate\Http\Request;
class ProductoController extends Controller
{
//
}
Obtener datos de una base de datos mediante Eloquent ORM
Vamos a obtener todos los registros de la tabla productos
mediante la función obtenerProductos
en nuestro controlador ProductoController
public function obtenerProductos()
{
// Obtenemos todos los productos de nuestra tabla
$o_productos = Producto::get();
// Obtener todos los productos de nuestra tabla en formato array
$o_productos = Producto::get()->toArray();
return $o_productos;
}
Guardar datos en una base de datos mediante Eloquent ORM
Supongamos que queremos crear un nuevo producto mediante la información que nos envian por un formulario
public function crearProducto(Request $request)
{
// Creamos un objeto de tipo Producto
$o_nuevo_producto = new Producto();
// Añadimos los parámetros recibidos por el formulario
$o_nuevo_producto->name = $request->nombre;
$o_nuevo_producto->precio = $request->precio;
// Guardamos el producto
$o_nuevo_producto->save();
return $o_nuevo_producto;
}
Actualizar Datos de un registro en una base de datos mediante Eloquent ORM
Supongamos que queremos editar el nombre de un producto mediante información de un formulario
public function editarProducto(Request $request, $producto) { // Buscamos el producto a editar // Find busca el id que le pasamos es decir si $producto = 1, buscará id = 1 $o_producto_editar = Producto::find($producto);
// Modificamos el nombre del producto $o_producto_editar->name = $request->nombre;
// Actualizamos el producto $o_producto_editar->save();
return $o_producto_editar; }
Eliminar datos de una base de datos mediante Eloquent ORM
Supongamos que nos hemos quedado sin producto y queremos eliminarlo
public function eliminarProducto($producto)
{
// Buscamos el producto a eliminar
// Find busca el id que le pasamos es decir si $producto = 1, buscará id = 1
$o_producto_eliminado = Producto::find($producto);
// eliminamos el producto
$o_producto_eliminado->delete();
return $o_producto_eliminado;
}