Laravel Eloquent关联查询如何为每个推荐分类限制关联产品为3条
问题原因
你原有代码的问题在于:with() 方法中的闭包约束是作用在整个关联products的查询语句上,take(3) 会全局截取所有关联产品的前3条结果,这3条仅会匹配到对应的第一个分类,其余分类自然没有匹配的关联产品返回。
解决方案
方案1:使用专用扩展包实现(推荐,性能最优)
该方案可以完美解决预加载时按父模型分组截取关联数据的需求,不会产生N+1查询问题:
- 首先安装扩展包:
composer require staudenmeir/eloquent-eager-limit
- 在你的
Category模型和Product模型中引入对应的Trait:
use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; class Category extends Model { use HasEagerLimit; // 其余模型原有代码 } class Product extends Model { use HasEagerLimit; // 其余模型原有代码 }
- 直接使用你原有的查询逻辑即可实现需求:
$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
相关产品推荐
相关产品推荐

