33 ⭐ MÓDULO FAVORITOS (Wishlist): Migración, Modelos y Relación Many-to-Many | Laravel 12 E-commerce

Duración: 45 min
Módulo: 🛒 Tienda Online (Frontend Shop) y Funcionalidades 25-33 Lección 9 de 9

Descripción

Lección 33: ⭐ Módulo Favoritos (Wishlist) | Relación Muchos a Muchos en Laravel

Este capítulo se enfoca en crear el módulo de productos favoritos, una funcionalidad clave que permite a los usuarios guardar productos de interés para una futura compra. La implementación requiere establecer una relación muchos a muchos (Many-to-Many) entre usuarios y productos.

🧱 Diseño y Migración de la Base de Datos

Para enlazar múltiples productos con múltiples usuarios, se diseña una tabla pivote:

  • Creación del Modelo y Migración: Se utiliza el comando php artisan make:model ProductoFavorito -mcr para generar el modelo, la migración y el controlador [04:45].
  • Tabla Pivote: La tabla productos_favoritos se crea para contener las llaves foráneas:
    • usuario_ID: Relacionada con la tabla users [05:57].
    • producto_ID: Relacionada con la tabla productos [06:23].
  • Integridad Referencial: Se añade la cláusula onDelete('cascade') a ambas claves foráneas para asegurar que si un producto o un usuario es eliminado, los registros asociados en esta tabla también se eliminen automáticamente [06:09].

🔗 Definición de las Relaciones en Modelos

Se establecen las relaciones de la tabla pivote en los modelos principales, siguiendo la lógica de Laravel:

  • Modelo ProductoFavorito: Se define que un producto favorito belongsTo (pertenece a) un User y que también belongsTo (pertenece a) un Producto [08:57], [09:46].
  • Modelo User: Se define que un usuario hasMany (tiene muchos) ProductoFavorito [09:18].
  • Modelo Producto: Se define que un producto hasMany (tiene muchos) ProductoFavorito [10:01].

💾 Implementación de la Funcionalidad "Añadir a Favoritos"

Se configura la acción para guardar el producto seleccionado por el usuario autenticado:

  • Rutas: Se definen dos rutas en web.php: una ruta GET (/favoritos) para listar los productos y una ruta POST (/favoritos) para guardar la información [10:46], [11:58].
  • Envío de Datos: El botón de corazón ❤️ en el listado de productos se envuelve en un formulario POST que transmite el ID del producto a guardar, junto con el token CSRF [15:25].
  • Controlador (store):
    1. Validación de Duplicados: Antes de guardar, se verifica si el producto ya existe en la lista de favoritos del usuario autenticado para evitar registros dobles [23:05]. Si ya existe, retorna un mensaje de información.
    2. Guardado: Si no existe, se crea un nuevo registro en ProductoFavorito, asociando el ID del usuario autenticado con el ID del producto recibido [17:29].
    3. Notificación Sweet Alert: Se implementa Sweet Alert en la plantilla web para mostrar mensajes de confirmación (Producto favorito agregado) o advertencia [18:17], [20:33].

📃 Vista del Wishlist y Conteo

Se crea la interfaz para que el usuario pueda ver su lista y se añade un contador dinámico:

  • Vista Dedicada: Se crea la vista favoritos.blade.php con el layout de la cuenta de usuario para listar los productos [25:28].
  • Listado Dinámico: La función index del controlador realiza una consulta que trae los ProductoFavorito del usuario autenticado y carga la relación con el producto para mostrar su nombre, precio y stock [25:41], [36:09].
  • Contador en Header: Se implementa un contador dinámico en la cabecera del sitio para mostrar la cantidad de productos favoritos que el usuario tiene actualmente, lo que se logra consultando la base de datos solo si el usuario está autenticado [43:37], [44:31].