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

如何在Laravel联合查询中使用->where()筛选未售出商品?

解决方案

你遇到的问题是因为sold字段在products和listings表中都存在,直接写where('sold', 0)会让数据库无法确定要筛选哪个表的字段,且左连接下直接加where条件可能会意外过滤掉没有对应listing的产品。根据你的需求,分两种场景提供修改方案:

场景1:保留所有产品,仅关联未售出的listing

如果需要展示所有产品,同时只计算该产品下未售出listing的最低价格(无未售出listing的产品,min_price会为null),可以将筛选条件放到leftJoin的关联条件中:

public function showProducts()
{
    $products = Product::leftJoin('listings', function($join) {
        $join->on('products.id', '=', 'listings.pid')
             ->where('listings.sold', 0); // 仅关联未售出的listing
    })
        ->groupBy('products.id', 'products.name', 'products.first_image', 'products.stylecode', 'products.brand', 'products.release_date', 'products.sold', 'products.slug')
        ->select('products.*', DB::raw('MIN(listings.price) as min_price'))
        ->get();

    return view('index', compact('products'));
}

场景2:仅展示存在未售出listing的产品

如果只需要显示有未售出listing的产品,直接在查询中指定筛选listings表的sold字段即可:

public function showProducts()
{
    $products = Product::leftJoin('listings', 'products.id', '=', 'listings.pid')
        ->where('listings.sold', 0) // 指定筛选listings表的未售出记录
        ->groupBy('products.id', 'products.name', 'products.first_image', 'products.stylecode', 'products.brand', 'products.release_date', 'products.sold', 'products.slug')
        ->select('products.*', DB::raw('MIN(listings.price) as min_price'))
        ->get();

    return view('index', compact('products'));
}

关键说明

  • 必须明确指定字段所属的表(listings.sold),避免和products表的sold字段混淆;
  • 场景1的写法不会过滤掉没有对应listing的产品,场景2会自动将左连接转为内连接效果,只保留有未售出listing的产品。

内容的提问来源于stack exchange,提问作者Kai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:10:06