如何将筛选未封禁供应商商品的查询转为Laravel Eloquent查询构造器?
筛选归属未封禁供应商的商品(Laravel Eloquent实现)
嘿,这事儿我太熟了,Laravel Eloquent有好几种干净的写法来实现这个需求,先给你最常用的几种方案:
首先得确保你的模型关联已经正确定义,在Product模型里添加和Vendor的关联:
// app/Models/Product.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { // 定义与Vendor的关联:每个商品属于一个供应商 public function vendor() { return $this->belongsTo(Vendor::class); } }
方案1:使用whereHas(推荐,最符合Eloquent风格)
这是最直观的方式,通过关联查询直接过滤出关联供应商未被封禁的商品:
// 获取所有归属未封禁供应商的商品 $products = Product::whereHas('vendor', function ($query) { $query->where('is_blocked', 0); })->get();
whereHas会检查商品对应的供应商存在,并且满足is_blocked = 0的条件,完美匹配你的需求。
方案2:使用join查询(适合需要联合查询其他字段的场景)
如果你需要同时获取供应商的某些字段,或者习惯用SQL的join写法,也可以这么做:
$products = Product::join('vendors', 'products.vendor_id', '=', 'vendors.id') ->where('vendors.is_blocked', 0) ->select('products.*') // 只选择商品表的字段,避免字段名冲突 // 如果需要供应商字段,可以加 ->addSelect('vendors.name as vendor_name') ->get();
不过这种写法不如whereHas优雅,尤其是当你已经定义了模型关联的时候。
方案3:全局作用域(适合频繁需要过滤的场景)
如果你的系统里大部分查询都需要排除封禁供应商的商品,可以给Product模型添加全局作用域,这样每次查询都会自动过滤:
// app/Models/Product.php protected static function booted() { static::addGlobalScope('active_vendor', function ($query) { $query->whereHas('vendor', function ($subQuery) { $subQuery->where('is_blocked', 0); }); }); }
之后直接执行Product::get()就会自动返回未封禁供应商的商品。如果偶尔需要绕过这个过滤,用:
// 临时禁用全局作用域,获取所有商品(包括封禁供应商的) $allProducts = Product::withoutGlobalScope('active_vendor')->get();
内容的提问来源于stack exchange,提问作者irjawais
相关产品推荐
相关产品推荐

