如何在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
相关产品推荐
相关产品推荐

