如何限制我的查询以使每个类别仅获得5个产品?

时间:2018-07-24 13:11:51

标签: php sql laravel laravel-5 backend

好的,大家好,我在这个问题上苦苦挣扎了一段时间,所以我需要您的帮助。

这是我的数据库中有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种产品。使用我提供的代码,我无法在查询中进行逻辑限制。

2 个答案:

答案 0 :(得分:0)

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

$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

答案 1 :(得分:0)

您不能对数据库 group by 语法进行操作。 数据库 group by 返回每个组中的单个项目。

您需要使用雄辩的收集方法 groupBy() 。 通过这种方法,您可以根据需要的条件来过滤组。

Laravel eloquent groupBy() method doc