如何在Laravel中在用户和产品之间创建正确的ManyToMany关系



我正在使用Laravel 5.8进行一个在线商店项目,在这个项目中,我想添加"添加到收藏夹";用户将产品添加到他们喜爱的列表的能力。

所以我创建了一个这样的模型:

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

在产品模型中,我添加了以下内容:

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

这是用户模型:

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

现在我想确保我已经建立了正确的关系。

首先,一个选项是删除FavouriteProduct模型,但保留favourite_products表。(这是我的建议(。

或者,您也可以更改FavourteProduct以扩展Pivot而不是Model,并将->using(FavouriteProduct::class)添加到UserProduct上的两个收藏夹关系中。

我对下面的两种方法进行了更详细的介绍。


选项1:简单关系

如果你同意我的第一个建议,你需要做出以下改变。

Product模型上,您需要添加以下关系:

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

User型号上,您需要添加以下关系:

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

这将允许您只需执行以下操作即可添加收藏夹:

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

选项2:更复杂的Pivot模型

如果您打算向两个模型之间的Pivot关系添加附加信息和关系,最好只使用pivot选项。

类似于Product型号

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

类似于User型号

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

但我建议您开始使用更Laravel标准的方法;它带来了巨大的好处,包括在学习时仍然能够遵循文档中的示例。

使用usr_idprd_id这样的列除了让你的生活更艰难之外,真的没有什么区别。如果你使用了user_idproduct_id,你就不需要把它们传给每一段关系,就可以告诉拉拉威尔你决定使用你的惯例而不是拉拉威尔。

Laravel将自动假设这些关系,因此如果您添加一个belongsToMany,它将查看在其上实现的类,在本例中为User::class,并且它将自动使用关键字user_id。它还将查看关系中的类,例如Product::class,并使用product_id。当然,除非你告诉它像你做的那样使用特定的东西。

最后,你可以自由地这样做,有时你会从其他地方继承数据库,并被迫这样做

例如,在用户模型中:您正在设置与Product的关系:因此更改类:

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

我不确定钥匙的顺序。

在两个模型中不能有两个同名方法!用户模型中可以是favourites(),但产品模型中的favourites()允许认为该产品可能有最喜欢的用户。您应该有一个描述性的名称,以便更容易理解您的代码。我从这个教程中学到了很多,我推荐给你。

执行此操作的简单方法是检查产品是否存在于用户喜爱的列表中

$data = Favourite::where(['user_id' => Auth::User()->id, 'product_ref_id' => $productId[1]])->get();
if (sizeof($data) > 0) {
Session()->put('snackmsg', 'Product already Exists in Wishlist');
}else{      
$Favourite = Favourite::create([
'user_id' => Auth::User()->id,
'product_ref_id' => $productId[1],
]);
$totalFavourite = Favourite::where('user_id',Auth::User()->id)->count();
Session()->forget('totalFavourite');
Session()->put('totalFavourite', $totalFavourite);
Session()->put('snackmsg', 'Added to Wishlist');
}

相关内容

  • 没有找到相关文章

最新更新