Définir les modèles produits et catégories dans Strapi
Créez les schémas pour les produits et les catégories, et reliez-les dans Strapi 5.
Définir le modèle de catégorie de produit
Dans Strapi, chaque Content Type correspond à un schéma JSON qui décrit sa structure et ses relations. Ici, on va créer un type categorie-de-produit pour organiser les produits de ta boutique.
1. Schéma JSON de la catégorie
1{2"kind": "collectionType",3"collectionName": "categorie_de_produits",4"info": {5"singularName": "categorie-de-produit", // ^? Identifiant unique6"pluralName": "categorie-de-produits",7"displayName": "Catégorie de produit"8},9"options": {10"draftAndPublish": true // ^? Permet le mode brouillon11},12"attributes": {13"name": {14"type": "string",15"required": true // @callout: Chaque catégorie doit avoir un nom16},17"products": {18"type": "relation",19"relation": "manyToMany",20"target": "api::produit.produit", // ^? Cible le modèle produit21"inversedBy": "categories" // @callout: Inverse the mapping22}23}24}
Tip
Le mode draftAndPublish te donne la flexibilité de travailler en mode brouillon
avant de rendre une catégorie visible en production.
Explications clés
kind: "collectionType"indique que tu gères plusieurs entrées.nameest un champ simple string.productsétablit une relation many-to-many avec le modèleproduit.inversedBydoit correspondre au champcategoriesdu modèle cible.
Définir le modèle de produit
Passons au cœur de ton e-commerce : le modèle Produit. Il regroupe toutes les infos (nom, description, prix, image) et les relations vers les catégories.
1{2"kind": "collectionType",3"collectionName": "produits",4"info": {5"singularName": "produit",6"pluralName": "produits",7"displayName": "Produit",8"description": "Contient les infos d’un article"9},10"options": {11"draftAndPublish": true12},13"attributes": {14"name": {15"type": "string",16"required": true17},18"description": {19"type": "text"20},21"price": {22"type": "integer",23"min": 0,24"default": 025},26"image": {27"type": "media",28"multiple": false,29"allowedTypes": ["images"]30},31"slug": {32"type": "uid",33"targetField": "name",34"required": true35},36"categories": {37"type": "relation",38"relation": "manyToMany",39"target": "api::categorie-de-produit.categorie-de-produit",40"mappedBy": "products" // ^? Renvoie à la clé inversée41},42"stock": {43"type": "integer",44"default": 0,45"required": true46},47"devStripeProductId": {48"type": "string",49"unique": true,50"private": true51},52"stripeProductId": {53"type": "string",54"unique": true,55"private": true56}57}58}
À retenir
- UID pour le champ
slug: génère une URL friendly à partir du nom. - Media pour l’image : stocke la référence vers le fichier téléchargé.
- Champs
privatesont invisibles via l’API publique.
Comprendre la relation many-to-many
- manyToMany côté catégorie :
productsinversedBycategories. - manyToMany côté produit :
categoriesmappedByproducts.
Cette configuration crée une table de jonction automatique dans la base de données, sans que tu aies à gérer manuellement la migration SQL.
Tip
Si tu veux ajouter des métadonnées à cette relation (ex. addedAt), tu bascules sur un component
ou créés explicitement un composant de liaison dans Strapi.
Points clés de la leçon
- Chaque Content Type est un fichier JSON dans
src/api/<type>/schema.json. draftAndPublishactive le cycle vie brouillon/publication.- Les relations manyToMany produisent une table de liaison transparente.
- Utilise
uidpour générer automatiquement unslugbasé sur un champ cible. - Les attributs
privatene sont pas exposés dans l’API publique.
Exercices rapides
- Crée un Content Type
marqueavec un champname(string) et une relation one-to-many versproduit. - Modifie le modèle
produitpour ajouter un champrating(decimal, min 0, max 5, default 0). - Dans l’interface Strapi Admin, teste la création d’une catégorie et associe-y deux produits.
Liens utiles :