使用Laravel 5.2 Collection中的列名获取唯一值的计数

时间:2017-10-11 19:28:56

标签: php laravel laravel-5 laravel-5.2 laravel-collection

我正在尝试从我的产品表中获取来自Laravel系列的独特品牌数量。

我能够使用产品的特定查询来做到这一点,但我现在使用集合的原因是因为我还想获得产品来源(国家),条件(使用/新)我觉得从一个查询中使用一个集合会更好,而不是每个数据都有三个单独的查询。

以下代码有效但不会显示每个独特品牌的数量。

这是表格 enter image description here

这是我的控制器

$products = DB::table('products')
 ->select('products.*')
 ->whereNull('products.deleted_at')
 ->get();

$BrandCollection = collect($products);
$Brands = $BrandCollection->unique('Brand')->sortBy('Brand')->keyBy('Brand')->pluck('Brand');

所以,我正在寻找的结果是

HP 3
东芝2
联想1

我认为可以使用concat进行收集,但由于我在Laravel 5.2上,我正在寻找其他解决方案。

2 个答案:

答案 0 :(得分:3)

如果你真的想使用集合(不是Eloquent),你可以这样做:

$brandsWithCount = $BrandCollection->groupBy('Brand')->map(function($values) {
    return $values->count();
})->sort()->reverse();

例如,如果您设置$brandCollection,请执行以下操作:

$BrandCollection = collect([
    ['Brand' => 'HP'],
    ['Brand' => 'HP'],
    ['Brand' => 'HP'],
    ['Brand' => 'Toshiba'],
    ['Brand' => 'Toshiba'],
    ['Brand' => 'Lenovo'],
]);

结果将是:

Collection {#372
  #items: array:3 [
    "HP" => 3
    "Toshiba" => 2
    "Lenovo" => 1
  ]
}

正如所料。

答案 1 :(得分:0)

有一个名为CountBy的集合帮助器,可以完全满足您的需求。

Collections CountBy

$BrandCollection->countBy('Brand');

它将如期回荡

#items: array:3 [
    "HP" => 3
    "Toshiba" => 2
    "Lenovo" => 1
  ]

简单:D