Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

233
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!