
# Schema

Schema's zijn optioneel. Een schema heeft twee afzonderlijke functies: het valideert elke schrijfbewerking en bepaalt voor welke velden [indexen](https://storh.inline0.dev/nl/docs/indexes) worden gemaakt. Collecties zonder schema accepteren arrays met willekeurige gegevens.

```php
$schema = Schema::collection('posts')
    ->string('slug')->unique()
    ->string('status')->index()
    ->int('publishedAt')->range()
    ->bool('featured')
    ->required(['slug', 'status']);

$posts = new DocStore($root, 'posts', schema: $schema);
```

De collectienaam in het schema moet overeenkomen met de collectienaam van de store; anders wordt een fout gegenereerd bij het maken van de instantie. Als u het schema aan de constructor doorgeeft, worden de gedeclareerde indexen ook meteen gesynchroniseerd.

## Validatieregels

- Velden `required` moeten aanwezig zijn in de geschreven gegevens. Er wordt gecontroleerd op aanwezigheid: een expliciete `null` voldoet aan de vereiste.
- Getypeerde velden worden alleen gecontroleerd als ze aanwezig en niet null zijn. Een veld `string` weigert een waarde van `int`; een veld `float` accepteert zowel `float` als `int`.
- Velden `mixed` accepteren alles en zijn handig om een veld als verplicht of geïndexeerd aan te duiden zonder het type te beperken.
- Voor velden die niet in het schema zijn gedeclareerd, gelden geen beperkingen.

Een mislukte validatie genereert een `StorageException` voordat er iets wordt geschreven.

## Veldtypen en vlaggen

Ondersteunde typen: `string`, `int`, `float`, `bool`, `mixed`.

Vlaggen per veld: `index()` (gelijkheidsindex), `unique()` (uniekheid wordt afgedwongen tijdens het schrijven), `range()` (geordende index voor `gt`/`lt`/`between`/`prefix` en geordende bereikqueries), en `required()`.

## Schemawijzigingen

Indexen worden gesynchroniseerd wanneer de store wordt aangemaakt. Als een schemawijziging de gedeclareerde indexset verandert, wordt het indexmanifest bijgewerkt en worden de betreffende indexen opnieuw opgebouwd uit de bestaande records. Wijzigingen in validatieregels gelden alleen voor toekomstige schrijfbewerkingen en wijzigen opgeslagen records nooit.

Hetzelfde `Schema`-object kan opnieuw worden gebruikt om getypeerde kolommen toe te wijzen in een [SQL-mirror](https://storh.inline0.dev/nl/docs/sql-mirror), ook voor collecties waarvan de store het schema zelf niet gebruikt.
