【问题标题】:How to limit my query to get only 5 products per category?如何将我的查询限制为每个类别仅获取 5 个产品?
【发布时间】:2025-11-25 23:05:01
【问题描述】:

好的,大家好,我正在为这个问题苦苦挣扎,所以我需要你的帮助。

所以问题是我有超过 6000 种产品的数据库,我想获取一些特定的类别及其子类别,以及与它们关联的产品。

这是我制作的存储类别的示例数组(键是所选类别 ID,数组值是所有子类别 ID)。

  $products_categories = array(
        3 => [
            4, 5 , 6
        ],
        10 => [
            40, 30, 20
        ]
    );

这是我获得所有具有这些类别的产品的雄辩查询。

  $all_fetched_categories = array_merge(...$products_categories);

  if (!empty($products_categories)) {
        $products = Product::query();

        $products = $products->with([
            'media',

        ])
        ->active()
        ->top()
        ->whereHas('categories', function ($query) use ($all_fetched_categories) {
                $query->whereIn('shop_category_id', $all_fetched_categories);
            });

        $products = $products->get();
    }

所以问题是,每个主要类别我只需要 5 个产品。使用我提供的代码,我无法在查询中进行逻辑限制。

【问题讨论】:

    标签: php sql laravel laravel-5 backend


    【解决方案1】:

    使用whereIn 获取类别,然后使用take(5) 过滤器添加products 预加载。像这样

    $total = 5;
    $categories = Categories::with(['products' => function($query) use ($total){
                                    $query->latest()->take($total);
                             },'products.media'])
                            ->whereIn('shop_category_id', $all_fetched_categories)
                            ->get() 
    

    假设您在$all_fetched_categories中有类别ID

    【讨论】:

    • 通过这种方式,您将总共为所有类别获取五种产品,因为 Laravel 对类别进行一次查询,然后对产品进行另一次查询,然后它会映射它收到的所有垃圾。通过这种方式,您可以将产品查询限制为 5。无论如何我都试过了,确实是近距离通话。感谢您的帮助。
    • @gogbog 您可以在该过滤器中添加latest,这样它就会为您提供最新的 5 种产品,您也可以使用变量来代替 5。我已经更新了答案
    【解决方案2】:

    您不能使用数据库 group by 语法来做到这一点。 数据库 group by 从每个组返回单个项目。

    你需要使用雄辩的收集方法groupBy()。 通过这种方法,您可以按您想要的任何条件过滤组。

    Laravel eloquent groupBy() method doc

    【讨论】: