我怎样才能用雄辩的关系做到这一点呢?
我正在处理一个在线商店项目,我想创建添加到收藏系统,以便用户将他们喜欢的产品添加到他们的收藏列表中。
所以我创建了一个名为favourite_products
的表,其内容如下:
所以usr_id
代表用户id,prd_id
代表产品id。
这里是User.php
型号:
public function favourites()
{
return $this->belongsToMany(Product::class, 'favourite_products', 'usr_id', 'prd_id')->withTimestamps();
}
这是Product.php
型号:
public function favouritees()
{
return $this->belongsToMany(User::class, 'favourite_products', 'prd_id', 'usr_id');
}
现在我想从此表中获取所有数据。
因此我尝试将此内容添加到控制器:
public function index()
{
$favouriteProducts = FavouriteProduct::all();
return view('admin.shop.favourites.all', compact('favouriteProducts'));
}
然后在刀片中:
@foreach($favouriteProducts as $fav_pro)
@php
$member_info = AppUser::where($fav_pro->usr_id)->first();
$product_info = AppShopProduct::find($fav_pro->prd_id);
@endphp
<tr class="closest-tr">
<td>{{ ++$menuCounter }}</td>
<td>{{ $member_info->usr_name }}</td>
<td>{{ $product_info->prd_name }}</td>
</tr>
@endforeach
但是我想知道,我如何通过User和Product Models关系检索usr_name
&;prd_name
?因此,我不需要在视图中添加Model name并从中获取数据.
我在控制器上尝试了这两个,但都是错误的:
Product::whereHas('favouritees')->get(); // if two different users add same product, it returns only one of them
User::whereHas('favourites')->get(); // if a user add different products, it returns only one of them for the user
所以问题是,我如何才能在具有User或Product多对多关系的表中显示favourite_products
的所有结果?
解决方案
若要获取所有数据(产品和喜欢该产品的用户),请获取与其相关的所有产品
$products = Product::whereHas('favouritees')->with('favouritees')->get();
// if two different users add same product, it returns only one of them but it will have two users in the relation favouritees
然后您可以在刀片中循环它们
@foreach($products as $product)
@foreach($product->favouritees as $user)
<tr class="closest-tr">
<td>{{ ++$menuCounter }}</td>
<td>{{ $user->usr_name }}</td>
<td>{{ $product->prd_name }}</td>
</tr>
@endforeach
@endforeach
相关文章