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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 19:54:04