194 votes

Laravel Eloquent groupBy() AND renvoie également le nombre de chaque groupe.

J'ai un tableau qui contient, entre autres colonnes, une colonne de versions de navigateurs. Et je veux simplement savoir, à partir de l'ensemble des enregistrements, combien il y a de versions de chaque type de navigateur. J'ai donc besoin d'obtenir quelque chose comme ceci : Total des enregistrements : 10 ; Internet Explorer 8 : 2 ; Chrome 25 : 4 ; Firefox 20 : 4 (le total est de 10).

Voici mes deux pence :

$user_info = Usermeta::groupBy('browser')->get();

Bien sûr, cela ne contient que les 3 navigateurs et non le nombre de chacun. Comment puis-je faire cela ?

0voto

Yuvraj Hinger Points 34

Si vous voulez obtenir des données triées, utilisez aussi ceci

$category_id = Post::orderBy('count', 'desc')
    ->select(DB::raw('category_id,count(*) as count'))
    ->groupBy('category_id')
    ->get();

0voto

Abe Nalisi Points 39

Dans Laravel 8, vous pouvez utiliser countBy() pour obtenir l'effectif total d'un groupe.

Vérifiez la documentation à ce sujet. https://laravel.com/docs/8.x/collections#method-countBy

0voto

Rubens Points 131

Solution simple (testée avec Laravel 9 et Spatie/Permissions).

Contrôleur :

//Get permissions group by guard name(3 in my case: web, admin and api)
$permissions = Permission::get()->groupBy('guard_name');

Voir :

@foreach($permissions as $guard => $perm)
  <div class="form-group">
    <label for="permission">Permissions ({{ ucfirst($guard) }}) {{ count($perm) }}</label>
    <select name="permission[]" id="permission" class="form-control @error('permission') is-invalid @enderror" multiple>
      @foreach($perm as $value)
        <option value="{{ $value->id }}">{{ $value->name }}</option>
      @endforeach
    </select>
    @error('permission')
      <div class="invalid-feedback">
        {{ $message }}
      </div>
    @enderror
  </div>
@endforeach

-1voto

Vulfoliac Points 17

Voici une façon plus Laravel de gérer les groupes par sans avoir besoin d'utiliser des instructions brutes.

$sources = $sources->where('age','>', 31)->groupBy('age');

$output = null;
foreach($sources as $key => $source) {
    foreach($source as $item) {
        //get each item in the group
    }
    $output[$key] = $source->count();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X