Laravel 如何实现从每个商品分类中各获取2条商品数据?
基于现有代码实现「每个商品分类取2条商品」的改造方案
前置调整:补全模型关联关系
当前两个模型没有定义分类和商品的关联规则,需要先补全基础关联才能实现关联取数:
- 给
Category模型增加商品一对多关联:
// Category.php class Category extends Model { protected $table = 'categories'; public function products() { return $this->hasMany(Product::class, 'category_id'); } }
- 给
Product模型增加分类反向关联:
// Product.php class Product extends Model { protected $table = 'products'; public function category() { return $this->belongsTo(Category::class, 'category_id'); } }
注:该实现依赖
products表存在category_id外键字段,为常规业务表设计。
控制器逻辑改造
替换原有index方法的取数逻辑,采用关联预加载方式实现需求,同时规避N+1查询性能问题:
public function index() { // 遍历全部分类,每个分类预加载2条最新商品 $categoryWithProducts = Category::with(['products' => function ($query) { $query->latest() // 保持原代码的创建时间倒序规则 ->take(2); // 单分类取2条 }])->get(); // 若需要返回扁平化的商品一维列表,遍历提取所有已取到的商品 $result = $categoryWithProducts->flatMap(fn($category) => $category->products); return $result; }
实现说明
- 原方法中冗余的
$products = Product::all();全量查询需要直接移除,避免无意义的数据库资源消耗 - 该实现仅需要执行2次SQL查询,查询总次数和分类总数量无关,不会产生性能浪费
- 如果需要保留分类-商品的层级结构返回,直接返回
$categoryWithProducts即可,无需做扁平化处理 - 若需要调整商品取数规则(比如按销量排序、过滤下架商品),只需要在关联的闭包内追加查询条件即可。
内容的提问来源于stack exchange,提问作者Kerim
相关产品推荐
相关产品推荐

