You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:38:27