7 Laravel Collection Methods You Might Not Know
Tags: laravel, webdev, php
Published: 2021-10-12 11:54:20

In Laravel, instances of Collections are used absolutely everywhere. There are lots of methods you can use on them. In the beginning, I just used the most well-known methods like `map`, `filter`, `reduce` and `first`. But there are many more, and some of them are useful shortcuts to reduce boilerplate.

Here are my top 7 methods I use all the time, but did not know when I started with Laravel.

## 1 `keyBy`

The `keyBy` method adds keys to a Collection. You can specify the key by its name or with a callback:

```php
$c = collect([
    ['id' => 'ID-1', 'name' => 'Alice', 'age' => 34],
    ['id' => 'ID-2', 'name' => 'Kevin', 'age' => 39],
]);

$c->keyBy('id');
/*
    collect([
        'ID-1' => ['id' => 'ID-1', 'name' => 'Alice', 'age' => 34],
        'ID-2' => ['id' => 'ID-2', 'name' => 'Kevin', 'age' => 39],
    ])
*/
```

It's a neat shortcut for `mapWithKeys` where the value is unchanged.

## 2 `reject`

`reject` is the inverse of the well-known `filter` method. It can be called with a value or a callback:

```php
$c = collect(['Alice', 'Bob', null, 'Ben', 'Carla']);

$c = $c->reject(null);
// collect(['Alice', 'Bob', 'Ben', 'Carla']);

$c->reject(fn(string $name): bool => str_starts_with($name, 'B'));
// collect(['Alice', 'Carla']);
```

I use `reject` to replace instances of `filter` where the condition is negated because it makes the code more readable.

## 3 `pluck`

The `pluck` method allows you to retrieve nested values of a Collection. If you pass a second argument to `pluck`, it will use it to add keys:
 
```php
$employees = collect([
    ['name' => 'Alice', 'position' => 'Manager',    'age' => 45],
    ['name' => 'Bob',   'position' => 'Programmer', 'age' => 39],
    ['name' => 'Carl',  'position' => 'Manager',    'age' => 51],
    ['name' => 'Darcy', 'position' => 'Programmer', 'age' => 28],
]);

$employees->pluck('name');
// collect(['Alice', 'Bob', 'Carl', 'Darcy'])

$employees->pluck('age', 'name');
// collect(['Alice' => 45, 'Bob' => 39, 'Carl' => 51, 'Darcy' => 28])
```

It's a shortcut for `map` or `mapWithKeys` where you just want to get some values.

## 4 `contains`

The `contains` method reports whether the given value is present in the Collection. But what I did not know was, that you can also pass a key, to check for a nested value:

```php
$employees = collect([
    ['name' => 'Alice', 'position' => 'Manager',    'age' => 45],
    ['name' => 'Bob',   'position' => 'Programmer', 'age' => 39],
    ['name' => 'Carl',  'position' => 'Manager',    'age' => 51],
    ['name' => 'Darcy', 'position' => 'Programmer', 'age' => 28],
]);

$employees->contains('name', 'Jack');
// false

$employees->contains('name', 'Bob');
// true
```

This can replace combinations like `->pluck('name')->contains('Jack')`, where you first  retrieve values to then call `contains` on them.

## 5 `firstWhere`

`firstWhere` is a classic shortcut which returns the first value which matches a certain condition. The condition can be a value, callback or key with operator and operand:

```php
$employees = collect([
    ['name' => 'Alice', 'position' => 'Manager',    'age' => 45],
    ['name' => 'Bob',   'position' => 'Programmer', 'age' => 39],
    ['name' => 'Carl',  'position' => 'Manager',    'age' => 51],
    ['name' => 'Darcy', 'position' => 'Programmer', 'age' => 28],
]);

$employees->firstWhere('age', '>' 50);
// ['name' => 'Carl', 'position' => 'Manager', 'age' => 51]
```

This is a shortcut for a combination of chained calls to `where` and `first`.

## 6 `flatMap`

The `flatMap` method combines the `map` and the `flatten` methods. The callback given to `flatMap` can modify each element. Then, all the values are flattened into a new collection.

```php
$employees = collect([
    ['name' => 'Alice', 'position' => 'Manager',    'age' => 45],
    ['name' => 'Bob',   'position' => 'Programmer', 'age' => 39],
    ['name' => 'Carl',  'position' => 'Manager',    'age' => 51],
    ['name' => 'Darcy', 'position' => 'Programmer', 'age' => 28],
]);

$employees->flatMap(
    fn($e) => strtoupper($e['name'])
);
// collect(['ALICE', 'BOB', 'CARL', 'DARCY'])
```

This is a shortcut for a combination of chained calls to `flatten` and `map`.

## 7 `partition`

`partition` allows to separate the values in a Collection into two Collections, based on a callback:

```php
$employees = collect([
    ['name' => 'Alice', 'position' => 'Manager',    'age' => 45],
    ['name' => 'Bob',   'position' => 'Programmer', 'age' => 39],
    ['name' => 'Carl',  'position' => 'Manager',    'age' => 51],
    ['name' => 'Darcy', 'position' => 'Programmer', 'age' => 28],
]);

[$m, $p] = $employees->partition(
    fn($e) => $e['position'] === 'Manager'
);

$m;
/*
    collect([
        ['name' => 'Alice', 'position' => 'Manager', 'age' => 45],
        ['name' => 'Carl',  'position' => 'Manager', 'age' => 51],
    ])
*/

$p;
/*
    collect([
        ['name' => 'Bob',   'position' => 'Programmer', 'age' => 39],
        ['name' => 'Darcy', 'position' => 'Programmer', 'age' => 28],
    ])
*/
```

This can replace more complex `for` loops or multiple `filter` calls.

---

👉 See the [Laravel Documentation](https://laravel.com/docs/8.x/collections#available-methods) for the complete reference.

👉 *Which Collection methods are you using?*

👉 *Do you think Laravel has too many Collection methods and shortcuts?*