
# Schemat

Schematy są opcjonalne. Schemat pełni dwie niezależne funkcje: weryfikuje każdy
zapis i deklaruje pola objęte [indeksami](https://storh.inline0.dev/pl/docs/indexes). Kolekcje
bez schematu akceptują dowolne dane w postaci tablicy.

```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);
```

Nazwa kolekcji w schemacie musi być zgodna z nazwą kolekcji w magazynie;
w przeciwnym razie konstrukcja kończy się błędem. Przekazanie schematu do konstruktora powoduje też
natychmiastową synchronizację zadeklarowanych indeksów.

## Zasady walidacji

- Pola `required` muszą występować w zapisywanych danych. Sprawdzana jest obecność: jawne `null` spełnia wymóg pola.
- Pola typowane są sprawdzane tylko wtedy, gdy występują i nie mają wartości null. Pole typu `string` odrzuca wartość `int`; pole typu `float` akceptuje zarówno `float`, jak i `int`.
- Pola `mixed` akceptują dowolną wartość; można ich użyć do oznaczenia pola jako wymaganego lub indeksowanego bez ograniczania jego typu.
- Pola niezadeklarowane w schemacie nie podlegają ograniczeniom.

Nieudana walidacja powoduje zgłoszenie `StorageException`, zanim cokolwiek zostanie zapisane.

## Typy pól i flagi

Obsługiwane typy: `string`, `int`, `float`, `bool`, `mixed`.

Flagi pola: `index()` (indeks równości), `unique()` (unikalność wymuszana podczas zapisu), `range()` (indeks uporządkowany dla `gt`/`lt`/`between`/`prefix` i zapytań o uporządkowany zakres) oraz `required()`.

## Zmiany schematu

Indeksy są synchronizowane podczas tworzenia magazynu. Jeśli zmiana schematu modyfikuje
zestaw zadeklarowanych indeksów, zmienia się manifest indeksów, a indeksy, których dotyczy zmiana,
są odbudowywane na podstawie istniejących rekordów; zmiany reguł walidacji dotyczą tylko
przyszłych zapisów i nigdy nie modyfikują zapisanych rekordów.

Tego samego obiektu `Schema` można użyć do mapowania typowanych kolumn w mirrорze [SQL mirror](https://storh.inline0.dev/pl/docs/sql-mirror), także w kolekcjach, których magazyn
sam nie korzysta ze schematu.
