LaravelPackages.net
Acme Inc.
Toggle sidebar
melihovv/collection-grouped-by-model

A collection grouped by model

1.506
9
1.6.0
About melihovv/collection-grouped-by-model

melihovv/collection-grouped-by-model is a Laravel package for a collection grouped by model. It currently has 9 GitHub stars and 1.506 downloads on Packagist (latest version 1.6.0). Install it with composer require melihovv/collection-grouped-by-model. Discover more Laravel packages by melihovv or browse all Laravel packages to compare alternatives.

Last updated

Collection Grouped By Model

GitHub Workflow Status styleci

Packagist Packagist Packagist

This package allows easily group laravel collection by any php object (model, array/collection of models, etc), not only by scalars (strings, numbers, booleans).

Installation

Install via composer

composer require melihovv/collection-grouped-by-model

Usage

$posts = Post::all()
$postsGroupedByAuthor = (new CollectionGroupedByModel($posts))->groupByModel('author_id', 'author');

foreach ($postsGroupedByAuthor as $authorPosts) {
  $authorPosts->model(); // returns posts' author
  $authorPosts->collection(); // returns author's posts
}

Nested grouping: first group products by category, then by manufacturer.

$products = Product::all();
$groupedProducts = (new CollectionGroupedByModel($products))
    ->groupByModel('category_id', 'category')
    ->transform(function (CollectionGroupedByModel $productsGroupedByCategory) {
      return $productsGroupedByCategory->groupByModel('manufacturer_id', 'manufacturer');
    });

foreach ($groupedProducts as $categoryProducts) {
  $categoryProducts->model(); // returns category

  foreach ($categoryProducts->collection() as $manufacturerProducts) {
    $manufacturerProducts->model(); // returns manufacturer
    $manufacturerProducts->collection(); // returns products grouped by category and manufacturer
  }
}

Group by several models

$posts = Post::all()
$postsGroupedByAuthorAndCategory = (new CollectionGroupedByModel($posts))
    ->groupByModel(function (Post $post) {
      return "$post->author_id,$post->category_id";
    }, function (Post $post) {
      return [$post->author, $post->category];
    });

foreach ($postsGroupedByAuthorAndCategory as $authorPostsInCategory) {
  list($author, $category) = $authorPostsWithCategory->model();
  // or using php 7.1 array destruction
  [$author, $category] = $authorPostsWithCategory->model();
  $authorPostsWithCategory->collection(); // returns author's posts in category
}

Security

If you discover any security related issues, please email [email protected] instead of using the issue tracker.

Credits

This package is bootstrapped with the help of melihovv/laravel-package-generator.

Comments