Схема
Схемы необязательны. У схемы две независимые задачи: проверять каждую запись и объявлять, какие поля получают индексы. Коллекции без схемы принимают данные в виде любых массивов.
$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, в том числе для коллекций, хранилище которых само не использует эту схему.