使用Laravel 5.3,我有一个数据库,包括由数据透视表product_wishlist连接的用户,产品和愿望清单。架构如下:
USERS WISHLISTS PRODUCTS PRODUCT_WISHLIST
------------- ------------- -------------- ---------------
id id id product_id
name name name wishlist_id
user_id
在App / Wishlist.php中
public function products()
{
return $this->belongsToMany(Product::class, 'product_wishlist');
}
public function owner()
{
return $this->belongsTo(User::class);
}
在App / product.php中
public function wishlists()
{
return $this->belongsToMany(Whishlist::class, 'product_wishlist');
}
用户可以创建愿望清单并将产品添加到愿望清单。
在产品页面中,我正在尝试显示已登录用户的所有愿望清单。
$wishlists = Auth::user()->wishlists;
但是如果每个心愿单都包含产品,我也想要回复(只有在不包含产品的情况下,我才会在每个心愿单附近添加“添加到心愿单”按钮)。
我在Kabelo回答后编辑:
我想要的是显示单个产品页面,并在侧边栏中显示已登录用户的所有愿望清单(每个用户都有您自己的愿望清单):wishlist1(添加到列表),wishlist2(添加到列表),...但是,例如,如果此页面的产品已经在wishlist2中,则不显示“(添加到列表)”。在这些情况下,我可以显示“(从列表中删除)”
答案 0 :(得分:2)
用户可以创建心愿单并将产品添加到愿望清单。
从您的问题,我看到用户可以创建多个愿望清单,这是实现这一目标的一种方式。
在App / Wishlist.php中
class Wishlist extends Model
{
/**
* Get all of the products for the wishlist.
*/
public function products()
{
return $this->belongsToMany('App\Product', 'product_wishlist');
}
/**
* Get owner/creator of wishlist.
*/
public function owner()
{
return $this->belongsTo('App\User');
}
}
在App / Product
中class Product extends Model
{
/**
* Get the wishlists for the product.
*/
public function wishlists()
{
return $this->belongsToMany('App\Wishlist', 'product_wishlist');
}
}
在控制器功能
中$products = App\Products::with(['wishlist'=> function($query){
$query->where('user_id', Auth::user()->id);
}])->get();
return view('product.index', compact('products'))
在views / product / index.blade.php
中@foreach( $products as $product )
<div class="product">
<h3>{{ $product->name }}</h3>
@if( ! count($product->wishlists) )
<button>Add to wishlist</button>
@endif
</div>
@endforeach
在单品页面
上显示
在控制器
中public function show($id){
$_product = App\Products::where('id', $id)->first();
$wishlists = null;
$product_is_in_wishlist = false;
if(Auth::check()){
$wishlists = App\Wishlists::where('user_id', Auth::user()->id)
->with('products')->get();
foreach( $wishlists as $wishlist ){
if( $wishlist->products->where('id', $_product->id)->count() ){
$product_is_in_wishlist= true;
}
}
}
return view('product.show', compact('_product', 'wishlists', 'product_is_in_wishlist'));
}
在view / product / show.blade.php
中<div id='product_container'>
<h1>{{ $_product->name }}</h1>
@if( $product_is_in_wishlist )
<button>Remove from wishlist</button>
@else
<button>Add to wishlist</button>
@endif
</div>
<div id='wishlists_sidebar'>
<ul>
@foreach( $wishlists as $wishlist)
<li>{{ $wishlist->name }}</li>
@endforeach
</ul>
</div>