Aller au contenu

Schéma

Les schémas sont facultatifs. Un schéma remplit deux fonctions indépendantes : il valide chaque écriture et déclare les champs dotés d’index. Les collections sans schéma acceptent toutes les données sous forme de tableaux.

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

Le nom de la collection du schéma doit correspondre à celui du magasin ; sinon, la construction échoue. Le passage du schéma au constructeur synchronise aussi immédiatement les index déclarés.

Règles de validation

  • Les champs required doivent être présents dans les données écrites. Seule la présence est vérifiée : la valeur null explicite satisfait aussi cette exigence.
  • Les champs typés ne sont vérifiés que s’ils sont présents et non nuls. Un champ string rejette une valeur int ; un champ float accepte à la fois float et int.
  • Les champs mixed acceptent n’importe quelle valeur et permettent d’indiquer qu’un champ est obligatoire ou indexé sans imposer son type.
  • Les champs non déclarés dans le schéma sont libres de toute restriction.

Un échec de validation déclenche une StorageException avant toute écriture.

Types et indicateurs de champ

Types pris en charge : string, int, float, bool, mixed.

Indicateurs par champ : index() (index d’égalité), unique() (unicité imposée à l’écriture), range() (index ordonné pour gt/lt/between/prefix et les requêtes de plage ordonnées), et required().

Modifications du schéma

Les index sont synchronisés à la construction du magasin. Si une modification du schéma change l’ensemble d’index déclarés, le manifeste des index est mis à jour et les index concernés sont reconstruits à partir des enregistrements existants ; les modifications des règles de validation ne s’appliquent qu’aux écritures futures et ne réécrivent jamais les enregistrements stockés.

Le même objet Schema peut être réutilisé pour mapper des colonnes typées dans un miroir SQL, y compris pour les collections dont le magasin n’utilise pas lui-même le schéma.