Перейти к содержимому

Схема

Схемы необязательны. У схемы две независимые задачи: проверять каждую запись и объявлять, какие поля получают индексы. Коллекции без схемы принимают данные в виде любых массивов.

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, в том числе для коллекций, хранилище которых само не использует эту схему.