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

Laravel Eloquent关联查询如何为每个推荐分类限制关联产品为3条

问题原因

你原有代码的问题在于:with() 方法中的闭包约束是作用在整个关联products的查询语句上,take(3) 会全局截取所有关联产品的前3条结果,这3条仅会匹配到对应的第一个分类,其余分类自然没有匹配的关联产品返回。

解决方案

方案1:使用专用扩展包实现(推荐,性能最优)

该方案可以完美解决预加载时按父模型分组截取关联数据的需求,不会产生N+1查询问题:

  1. 首先安装扩展包:
composer require staudenmeir/eloquent-eager-limit
  1. 在你的 Category 模型和 Product 模型中引入对应的Trait:
use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;

class Category extends Model
{
    use HasEagerLimit;
    // 其余模型原有代码
}

class Product extends Model
{
    use HasEagerLimit;
    // 其余模型原有代码
}
  1. 直接使用你原有的查询逻辑即可实现需求:
$categories = Category::where('is_featured', true)->with('products', function ($query){
        $query->take(3);
    })->get();

方案2:原生逻辑实现(无需安装扩展,适合小数据量场景)

如果不想引入第三方依赖,也可以通过两次查询+集合处理实现需求:

// 第一步:查询所有推荐分类
$categories = Category::where('is_featured', true)->get();
// 第二步:查询所有关联产品,按分类ID分组后每组截取前3条
$products = Product::whereIn('category_id', $categories->pluck('id'))
    ->get()
    ->groupBy('category_id')
    ->map(fn ($group) => $group->take(3));
// 第三步:将处理好的产品数据关联到对应分类
$categories->each(function ($category) use ($products) {
    $category->setRelation('products', $products->get($category->id, collect()));
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 15:33:02