Przejdź do treści

Schemat

Schematy są opcjonalne. Schemat pełni dwie niezależne funkcje: weryfikuje każdy zapis i deklaruje pola objęte indeksami. 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, także w kolekcjach, których magazyn sam nie korzysta ze schematu.