Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

232
Vistas
Cómo crear una relación ManyToMany correcta entre un usuario y un producto en Laravel

Estoy trabajando en un proyecto de tienda en línea con Laravel 5.8 y en este proyecto, quería agregar la capacidad de "Agregar a favoritos" para que los usuarios agreguen un producto a su lista de favoritos.

Así que creé un modelo como este:

 class FavouriteProduct extends Model { protected $table = 'favourite_products'; protected $fillable = ['usr_id','prd_id']; public function users() { return $this->belongsToMany(User::class, 'favourite_products', 'id', 'usr_id'); } public function products() { return $this->belongsToMany(Product::class, 'favourite_products', 'id', 'prd_id'); } }

Y en el modelo de producto, agregué esto:

 public function favourites() { return $this->belongsToMany(Product::class, 'favourite_products', 'prd_id', 'id'); }

Y aquí está el modelo de usuario:

 public function favourites() { return $this->belongsToMany(FavouriteProduct::class, 'favourite_products', 'usr_id', 'id'); }

Ahora quería asegurarme de haber configurado la relación correctamente.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Primero, una opción sería eliminar su modelo de FavouriteProduct favourite_products mantener la tabla de productos_favoritos. (Cuál sería mi sugerencia).

O bien, también podría cambiar FavourteProduct para extender Pivot en lugar de Model y agregar ->using(FavouriteProduct::class) a ambas relaciones favoritas en User y Product .

He entrado en más detalles con los dos enfoques a continuación.


Opción 1: Relación simple

Si acepta mi primera sugerencia, deberá realizar los siguientes cambios.

En su modelo de Product , debe agregar la siguiente relación:

 public function favouritees() { return $this->belongsToMany(User::class, 'favourite_products', 'prd_id', 'usr_id') ->withTimestamps(); }

En su modelo User , debe agregar la siguiente relación:

 public function favourites() { return $this->belongsToMany(Product::class, 'favourite_products', 'usr_id', 'prd_id') ->withTimestamps(); }

Esto ahora le permitirá agregar favoritos simplemente haciendo algo como lo siguiente:

 $user = User::find($userId); $product = Product::find($productId); $user->favourites()->save($product);

Opción 2: un modelo Pivot más complejo

Sería mejor si solo usara la opción de pivote si tiene la intención de agregar información y relaciones adicionales a la relación de Pivot entre los dos modelos.

Me gusta esto en el modelo de Product

 public function favouritees() { return $this->belongsToMany(User::class, 'favourite_products', 'prd_id', 'usr_id')->using(FavouriteProduct::class); }

Me gusta esto en el modelo de User

 public function favourites() { return $this->belongsToMany(Product::class, 'favourite_products', 'usr_id', 'prd_id')->using(FavouriteProduct::class); }

Pero te sugiero que comiences a usar un enfoque más estándar de Laravel; viene con grandes beneficios, incluyendo poder seguir ejemplos en la documentación cuando uno todavía está aprendiendo.

El uso de columnas como usr_id y prd_id realmente no hace ninguna diferencia además de hacerte la vida más difícil. Si hubiera usado user_id y product_id , no necesitaría pasarlos a cada relación para decirle a Laravel que decidió usar su convención sobre Laravels.

Laravel asumirá automáticamente las relaciones, por lo que si agregas pertenecen a belongsToMany , observará la clase en la que está implementada, en este caso, User::class , y usará automáticamente la clave user_id . También observará la clase en la relación, por ejemplo, Product::class y usará product_id . Eso es, por supuesto, a menos que le diga que use algo específicamente como lo ha hecho.

Al final, eres libre de hacerlo, y hay ocasiones en las que heredas una base de datos de otro lugar y te ves obligado a hacerlo.

over 4 years ago · Santiago Trujillo Denunciar

0

Por ejemplo, en su modelo de usuario: está estableciendo una relación con el producto: así que cambie la clase:

 public function favourites() { return $this->belongsToMany(Product::class, 'favourite_products', 'usr_id', 'product_id'); }

No estoy seguro del orden de las teclas.

over 4 years ago · Santiago Trujillo Denunciar

0

¡No puede tener 2 métodos con el mismo nombre en dos modelos! En User Model puede ser favourites() , pero favourites() en Product Model permite pensar que ese producto podría tener un usuario favorito. Debe tener nombres descriptivos para facilitar la comprensión de su código. Aprendo muchísimo de este tutorial , te lo recomiendo.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda