
# スキーマ

スキーマは任意です。スキーマには、書き込みをすべて検証することと、どのフィールドに[indexes](https://storh.inline0.dev/ja/docs/indexes)を付けるかを宣言することの、独立した2つの役割があります。スキーマのないコレクションは、どのような配列データでも受け付けます。

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

スキーマのコレクション名はストアのコレクション名と一致している必要があります。一致しない場合、構築時に例外が発生します。スキーマをコンストラクターに渡すと、宣言されたインデックスもすぐに同期されます。

## 検証ルール

- `required`フィールドは、書き込むデータに含まれている必要があります。チェックされるのはフィールドの有無です。明示的な`null`も必須フィールドを満たします。
- 型付きフィールドは、存在しnullでない場合にのみ検証されます。`string`フィールドは`int`値を拒否します。`float`フィールドは`float`と`int`の両方を受け付けます。
- `mixed`フィールドはどの値でも受け付けます。型を制限せずに、フィールドを必須またはインデックス対象として指定する場合に便利です。
- スキーマで宣言されていないフィールドに制限はありません。

検証に失敗すると、何も書き込む前に`StorageException`例外が発生します。

## フィールドの型とフラグ

対応する型：`string`、`int`、`float`、`bool`、`mixed`。

フィールドごとのフラグ：`index()`（等価インデックス）、`unique()`（書き込み時に一意性を検証）、`range()`（`gt`/`lt`/`between`/`prefix`と順序付き範囲クエリ向けの順序付きインデックス）、`required()`。

## スキーマの変更

ストアの構築時にインデックスが同期されます。スキーマの変更で宣言済みインデックスの構成が変わると、インデックスマニフェストが更新され、影響を受けるインデックスが既存のレコードから再構築されます。検証ルールの変更は以後の書き込みにのみ適用され、保存済みレコードを書き換えることはありません。

同じ`Schema`オブジェクトを使って、[SQLミラー](https://storh.inline0.dev/ja/docs/sql-mirror)の型付きカラムを対応付けられます。ストア自体がそのスキーマを使用しないコレクションにも使えます。
