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

Laravel中如何从带翻译的多对多关联中仅获取活跃配件

嘿,我来帮你解决这个问题!你需要在多对多关联查询中过滤出active=1的活跃配件,有几种不同的实现方式,你可以根据自己的需求来选择:

1. 直接在当前查询中添加过滤条件

如果只是这次特定查询需要获取活跃配件,你可以直接在with的闭包中加入where('active', 1)。另外要注意:原来的has('accessori')只会检查产品是否有关联配件,但不会验证配件是否活跃。如果你想确保返回的产品至少关联了一个活跃配件,记得把has改成whereHas,这样能过滤掉那些只有非活跃配件的产品。

修改后的查询代码如下:

$products = Product::whereHas('accessori', function ($query) {
        // 确保产品至少关联一个活跃配件
        $query->where('active', 1);
    })
    ->with([
        'productsLang',
        'accessori' => function ($query) {
            // 加载关联时只取活跃配件,同时带上对应的语言信息
            $query->with('accessoriLang')->where('active', 1);
        }
    ])->get();

return $products;

2. 定义专门的关联方法

如果你经常需要查询产品的活跃配件,可以在Product模型里新增一个固化了过滤条件的关联方法,这样后续查询会更简洁:

// 在Product模型中新增关联方法
public function activeAccessori() {
    return $this->belongsToMany('App\Accessori', 'accessori_products')
        ->where('active', 1);
}

之后查询时直接使用这个关联即可:

$products = Product::has('activeAccessori')
    ->with([
        'productsLang',
        'activeAccessori' => function ($query) {
            $query->with('accessoriLang');
        }
    ])->get();

3. 全局作用域(默认只取活跃配件)

如果绝大多数场景下你都只需要获取活跃的配件,可以给Accessori模型添加全局作用域,这样所有对配件的查询默认都会自动过滤active=1的记录:

// 在Accessori模型中添加全局作用域
protected static function booted()
{
    static::addGlobalScope('active', function ($query) {
        $query->where('active', 1);
    });
}

添加后,你原来的查询代码不需要做任何改动,就能自动获取活跃配件。如果偶尔需要查询所有配件(包括非活跃的),可以用withoutGlobalScope('active')临时取消这个作用域。

另外提个小细节:你的Accessori模型里的accessoriProducts关联,写的是belongsToMany('App\Products'),但你的模型类名是Product(单数),这里应该改成'App\Product',避免出现类找不到的问题哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:00:43