Modelos y Eloquent ORM en Laravel 9

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

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;
    }