如何对countby数据的结果进行排序

时间:2019-04-05 22:24:51

标签: laravel laravel-5

我需要通过收集产品来查看产品表中最热门的刀片类别,并对它们的类​​别进行计数并对其分类结果进行排序

    $popular_channels = products::select('category')->get();

    $collection = collect($popular_products);
    $counted = $collection->countBy(function ($value){
        return $value['category'];
    });

    $sorted = array_values(Arr::sort($counted, function ($values) {
        return $values['category'];
    }));
    $counted = json_decode($counted,JSON_UNESCAPED_UNICODE);

    $popular = channels::query();

    foreach ($counted as $key=>$value)
    {
        $popular = $popular->where('id', $key);
    }
    $popular = $popular->offset(0)->limit(3)->orderby('id','desc')->get();

1 个答案:

答案 0 :(得分:0)

除了我的解决方案外,您的代码还有一些我不清楚的地方:

  • 为什么要在处理类别时创建一个名为$popular_channels的数组,然后在最后几行中将频道模型引入$popular数组中?
  • $sorted数组的用途是什么?
  • 您要选择流行的categories ID,然后使用类别表中的ID在ID列上过滤channels。这些是否相关或以任何方式连接?

还有一些可能有用的注释:

  • get方法返回一个collection实例,因此您实际上不需要调用collect方法
  • 按id(代码的最后一行)排序将导致结果按表ID排序,而不是按您首先检索的流行类别ID排序。
  • 我认为您试图仅通过第一步中找到的常用ID来过滤频道,而不是遍历已计数的数组,而最好使用whereIn($field, $keys)

从代码中得出的解决方案尝试

要正确,完整地回答,也许您应该从迁移/数据库结构和模型类中摘录,但要进行一些调整(列名,表名,模型,错别字等),此查询应该这样做:< / p>

$populars = DB::table('products')
    ->selectRaw('category_id, count(*) as productsCount'))
    ->groupBy('category_id')
    ->orderBy('productsCount', 'desc')
    ->limit(3)
    ->get()
    ->toArray();

$channels = channels::whereIn('id', $populars)
    ->orderByRaw('FIELD(id,' . implode(',', $populars) . ')') // Preserve the I'd order as retrieved before
    ->get();