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

如何将筛选未封禁供应商商品的查询转为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:08:21