我正在使用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)
添加到User
和Product
上的两个收藏夹关系中。
我对下面的两种方法进行了更详细的介绍。
选项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_id
和prd_id
这样的列除了让你的生活更艰难之外,真的没有什么区别。如果你使用了user_id
和product_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');
}