Laravel控制器查询:如何判断商品是否在用户收藏列表中?
在Laravel控制器中通过查询标记商品是否已收藏
步骤1:定义模型关联
先在Product模型中定义与收藏表的关联:
// app/Models/Product.php public function favourites() { // 关联Favourite模型,外键为productid,对应Product的productid字段 return $this->hasMany(Favourite::class, 'productid', 'productid'); }
Favourite模型可补充反向关联(可选):
// app/Models/Favourite.php public function product() { return $this->belongsTo(Product::class, 'productid', 'productid'); }
步骤2:控制器查询添加isFavourite字段
利用Laravel的withExists方法(推荐,简洁且避免N+1查询),在查询商品时直接标记当前用户是否收藏该商品:
// 商品展示控制器的方法 public function index() { // 获取当前登录用户的customer_id(需确保用户已登录,根据你的Auth配置调整) $customerId = auth()->user()->customer_id; // 查询所有商品,并添加isFavourite字段 $products = Product::withExists([ 'favourites as isFavourite' => function ($query) use ($customerId) { $query->where('customer_id', $customerId); } ])->get(); return view('products.index', compact('products')); }
如果更习惯原生SQL写法,也可以用selectRaw实现:
$products = Product::select('products.*') ->selectRaw('EXISTS(SELECT 1 FROM favourites WHERE favourites.productid = products.productid AND favourites.customer_id = ?) AS isFavourite', [$customerId]) ->get();
步骤3:简化视图判断
现在视图里直接读取isFavourite字段即可,无需额外查询:
@foreach($products as $product) @if($product->isFavourite) <i class="favourite-red">icon-heart</i> @else <i class="favourite-white">icon-heart</i> @endif @endforeach
说明
这种方式将判断逻辑提前到数据库查询阶段,避免了视图循环中多次查询收藏表的N+1性能问题,同时让视图代码更简洁。
内容的提问来源于stack exchange,提问作者leatherjacket4
相关产品推荐
相关产品推荐

