> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Collection deep dive

> Een verdieping in de implementatie van Laravel Collections vanuit vier invalshoeken: geschiedenis, klassenstructuur, PHPDoc-generics en hoe je de code leest.

## Doel van deze pagina

Deze pagina gaat niet over het gebruik van `collect()`, maar biedt een kaart om de implementatiecode van Laravel zelf te lezen.

De doelgroep: mensen die de lijst met methodes van `Collection` al kennen en nu willen begrijpen "waarom het ontwerp zo is".

## Historische ontwikkeling

De structuur van Collections is flink herzien bij de introductie van `LazyCollection`.

### Tot Laravel 5.8

* `Illuminate\Support\Collection`
* `Illuminate\Database\Eloquent\Collection` (erft van `Collection`)

Op dat moment bestonden `LazyCollection`, `Enumerable` en `EnumeratesValues` nog niet.

* [Collection.php in 5.8](https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/Collection.php)
* [Eloquent Collection.php in 5.8](https://github.com/laravel/framework/blob/5.8/src/Illuminate/Database/Eloquent/Collection.php)

### Wijzigingen in Laravel 6.0

Samen met de toevoeging van `LazyCollection` is de gemeenschappelijke API afgesplitst naar `Enumerable` (interface) en `EnumeratesValues` (trait).

* [LazyCollection.php in 6.x](https://github.com/laravel/framework/blob/6.x/src/Illuminate/Support/LazyCollection.php)
* [Enumerable.php in 6.x](https://github.com/laravel/framework/blob/6.x/src/Illuminate/Support/Enumerable.php)
* [EnumeratesValues.php in 6.x](https://github.com/laravel/framework/blob/6.x/src/Illuminate/Support/Traits/EnumeratesValues.php)

## De huidige structuur (Laravel 13)

> Zie: [laravel/framework v13.x](https://github.com/laravel/framework/tree/13.x/src/Illuminate)

```mermaid theme={null}
classDiagram
    class Enumerable {
      <<interface>>
    }
    class EnumeratesValues {
      <<trait>>
    }
    class Collection
    class LazyCollection
    class EloquentCollection

    Collection ..|> Enumerable : implements
    LazyCollection ..|> Enumerable : implements
    Collection ..> EnumeratesValues : use
    LazyCollection ..> EnumeratesValues : use
    EloquentCollection --|> Collection : extends

    note for Enumerable "Contract voor de<br>gemeenschappelijke API"
    note for EnumeratesValues "Implementatie van de<br>gemeenschappelijke methodes"
    note for Collection "Directe evaluatie<br>in het geheugen"
    note for LazyCollection "Luie evaluatie op<br>basis van generators"
    note for EloquentCollection "Uitbreiding voor<br>Eloquent-modellen"
```

* [Collection.php](https://github.com/laravel/framework/blob/13.x/src/Illuminate/Collections/Collection.php)
* [LazyCollection.php](https://github.com/laravel/framework/blob/13.x/src/Illuminate/Collections/LazyCollection.php)
* [EnumeratesValues.php](https://github.com/laravel/framework/blob/13.x/src/Illuminate/Collections/Traits/EnumeratesValues.php)
* [Enumerable.php](https://github.com/laravel/framework/blob/13.x/src/Illuminate/Collections/Enumerable.php)
* [Eloquent Collection.php](https://github.com/laravel/framework/blob/13.x/src/Illuminate/Database/Eloquent/Collection.php)

<Info>
  Het huidige, werkelijke bestandspad is `src/Illuminate/Collections/*`, maar de namespace is `Illuminate\\Support` gebleven. Houd bij het lezen van de code "pad" en "namespace" dus apart in de gaten.
</Info>

## PHPDoc en generics in PHPStan-stijl

PHP zelf kent geen generics.
Toch wordt rondom Collections sterke type-informatie uitgedrukt via PHPDoc.

Daar zijn twee hoofddoelen mee gediend:

* Nauwkeurige IDE-aanvulling
* Betere precisie van statische analyse met PHPStan / Larastan en dergelijke

### Veelvoorkomende notaties

```php theme={null}
/**
 * @template TKey of array-key
 * @template-covariant TValue
 * @implements \Illuminate\Support\Enumerable<TKey, TValue>
 */
class Collection implements Enumerable
{
    /**
     * @use \Illuminate\Support\Traits\EnumeratesValues<TKey, TValue>
     */
    use EnumeratesValues;
}
```

| Notatie                         | Betekenis                                                                                |
| ------------------------------- | ---------------------------------------------------------------------------------------- |
| `@template TKey of array-key`   | Beperkt het sleuteltype tot `int\|string`                                                |
| `@template-covariant TValue`    | Behandelt het waardetype als covariant (veiliger te vervangen door een specifieker type) |
| `@implements ...<TKey, TValue>` | Geeft typeargumenten door aan de geïmplementeerde interface                              |
| `@extends ...<TKey, TModel>`    | Declareert typeargumenten bij het erven van de ouderklasse                               |
| `@use ...<TKey, TValue>`        | Declareert typeargumenten bij het toepassen van een trait                                |

### Hoe het eruitziet in de Eloquent Collection

```php theme={null}
/**
 * @template TKey of array-key
 * @template TModel of \Illuminate\Database\Eloquent\Model
 * @extends \Illuminate\Support\Collection<TKey, TModel>
 */
class Collection extends BaseCollection
{
}
```

Omdat `TValue` wordt geconcretiseerd naar `TModel`, wordt de type-inferentie van `map()`, `filter()` en dergelijke sterker toegespitst op Eloquent-modellen.

## In welke volgorde je de implementatie leest

### 1. Begin bij `Enumerable`

Krijg eerst grip op "welk contract wordt er geboden".
Als je hier het overzicht van methodes doorneemt, lees je de implementaties daarna sneller.

### 2. Volg de gemeenschappelijke methodes in `EnumeratesValues`

Veel gemeenschappelijke logica, zoals `map`, `filter` en `reduce`, staat hier.
Kijk je daarna alleen naar de verschillen tussen `Collection` en `LazyCollection`, dan sla je minder over.

### 3. Bekijk de verschillen tussen `Collection` en `LazyCollection`

* `Collection`: houdt een array vast en evalueert direct
* `LazyCollection`: evalueert lui met behulp van een `Generator`

Zelfs bij methodes met dezelfde naam verschillen het evaluatiemoment en het geheugengedrag.

### 4. Lees als laatste `Eloquent\Collection`

Concentreer je op de uitbreidingen voor verzamelingen van modellen, zoals `find`, `load` en `modelKeys`.
Lees je dit nadat je de basis-`Collection` begrijpt, dan zie je de bedoeling sneller.

<Tip>
  Wil je één methode uitdiepen, volg dan deze route: de declaratie in `Enumerable` → de implementatie in `EnumeratesValues` → wel of geen override in `Collection` / `LazyCollection`. Zo raak je niet de weg kwijt.
</Tip>

## Gerelateerde pagina's

* [Collections](/nl/collections)
* [Higher order messages van collections](/nl/advanced/higher-order-messages)
* [Macroable-trait](/nl/advanced/macroable)


## Related topics

- [进阶主题](/zh-CN/advanced/index.md)
- [Welcome](/index.md)
- [Collections](/nl/collections.md)
- [Laravel Bluesky](/nl/packages/laravel-bluesky/index.md)
- [Laravel Console Starter](/nl/packages/laravel-console-starter/index.md)
