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

Laravel中实现每个ProductType分类下查询指定数量关联Product的方法

问题根因

Laravel的关联预加载默认使用whereIn查询关联数据,在闭包中添加的limit是全局限制,仅会返回所有符合条件的前N条关联数据,再分配给对应的父模型,因此只会有第一个分类匹配到数据,其余分类关联结果为空。


解决方案

方案1:Laravel 8+ 原生实现

Laravel 8及更高版本已支持对每个父模型的关联结果单独限制条数,直接修改预加载逻辑即可:

public function index()
{
    $ptype = ProductType::with(['products1' => function($query) {
        return $query->take(2);
    }])->get();
    return view('frontend.index', compact('ptype'));
}

方案2:集合手动处理(全版本兼容)

如果使用的是8以下的Laravel版本,可以先查询全量产品后通过集合方法分组分配,逻辑简单易维护:

public function index()
{
    // 获取全部分类
    $ptype = ProductType::all();
    // 获取所有产品按分类ID、主键排序
    $products = Product::orderBy('product_type')->orderBy('id')->get();
    // 为每个分类挂载对应前2条产品
    $ptype->map(function ($type) use ($products) {
        $type->products1 = $products->where('product_type', $type->id)->take(2)->values();
        return $type;
    });
    return view('frontend.index', compact('ptype'));
}

方案3:窗口函数查询(大数据量最优)

如果产品表数据量较大,不想查询全量产品,可以通过MySQL窗口函数筛选每个分类的前N条数据,性能更高:

public function index()
{
    $ptype = ProductType::with(['products1' => function($query) {
        $query->fromRaw('(SELECT *, ROW_NUMBER() OVER (PARTITION BY product_type ORDER BY id) AS row_num FROM products) AS product_filtered')
              ->where('row_num', '<=', 2);
    }])->get();
    return view('frontend.index', compact('ptype'));
}

以上方案均可实现每个分类返回2条关联产品的需求,可根据自身使用的Laravel版本、数据量选择对应方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:27:01