
# Schema

Schemos yra pasirenkamos. Schema atlieka dvi atskiras funkcijas: tikrina kiekvieną įrašymą ir deklaruoja, kuriems laukams taikomi [indeksai](https://storh.inline0.dev/lt/docs/indexes). Kolekcijose be schemos priimami bet kokie masyvo duomenys.

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

Schemos kolekcijos pavadinimas turi sutapti su saugyklos kolekcijos pavadinimu; priešingu atveju kuriant objektą įvyksta klaida. Perduodant schemą konstruktoriui, deklaruoti indeksai taip pat iškart sinchronizuojami.

## Tikrinimo taisyklės

- `required` laukai turi būti įrašomuose duomenyse. Tikrinama, ar laukas yra: aiškiai nurodžius `null`, privalomo lauko reikalavimas įvykdomas.
- Tipuoti laukai tikrinami tik tada, kai jų reikšmė pateikta ir nėra null. `string` laukas atmeta `int` reikšmę; `float` laukas priima ir `float`, ir `int`.
- `mixed` laukai priima bet kokias reikšmes; jais naudinga pažymėti lauką kaip privalomą ar indeksuotą, neribojant jo tipo.
- Schemoje nedeklaruojamiems laukams apribojimų nėra.

Nepavykus patikrinti duomenų, išmetama `StorageException` klaida ir nieko neįrašoma.

## Laukų tipai ir žymos

Palaikomi tipai: `string`, `int`, `float`, `bool`, `mixed`.

Lauko žymos: `index()` (lygybės indeksas), `unique()` (unikalumas tikrinamas įrašymo metu), `range()` (surikiuotas `gt`/`lt`/`between`/`prefix` ir surikiuotų intervalų užklausų indeksas) ir `required()`.

## Schemos pakeitimai

Indeksai sinchronizuojami kuriant saugyklą. Jei pakeitus schemą pasikeičia deklaruotų indeksų rinkinys, pasikeičia indeksų manifestas, o paveikti indeksai atkuriami iš esamų įrašų; tikrinimo taisyklių pakeitimai taikomi tik būsimiems įrašams ir niekada nepakeičia saugomų įrašų.

Tą patį `Schema` objektą galima pakartotinai naudoti tipuotų stulpelių atvaizdavimui [SQL veidrodyje](https://storh.inline0.dev/lt/docs/sql-mirror), taip pat kolekcijoms, kurių saugykla pačios schemos nenaudoja.
