2017-10-11 1 views
0

J'essaye d'obtenir le nombre de marques uniques de ma table de produits avec leur compte d'une collection de Laravel.Obtenir le nombre de valeurs uniques avec le nom de la colonne dans Laravel 5.2 Collection

J'ai été capable de le faire en utilisant une requête spécifique pour les produits mais la raison pour laquelle j'utilise une collection est maintenant parce que je veux aussi obtenir les Origines de Produit (Pays), Conditions (Utilisé/Nouveau) des produits et je pensais qu'il serait préférable d'utiliser une collection d'une requête plutôt que d'avoir trois requêtes distinctes pour chaque donnée.

Le code ci-dessous fonctionne mais il ne montre pas le nombre de chaque marque unique.

Voici le tableau enter image description here

Voici mon contrôleur

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

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

Ainsi, le résultat que je cherche est

HP 3
Toshiba 2
Lenovo 1

Je pensais que cela pourrait être fait en utilisant concat pour la collection mais depuis que je suis sur Laravel 5.2, je suis à la recherche d'autres solutions.

Répondre

0

Si vous voulez vraiment utiliser les collections (non Eloquent), vous pouvez le faire comme ceci:

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

Par exemple, si vous définissez $brandCollection comme ceci:

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

résultat sera:

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

comme prévu.

+0

Parfait! Travaillé comme un charme. – user3659497

+0

Comment appliqueriez-vous le tri? Coz- sort ('Marque) -> reverse() ne fonctionne pas – user3659497

+0

@ user3659497 Ça marche pour moi, l'avez-vous vérifié? 'sort' devrait trier ascendant et' reverse' inversera l'ordre –