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.

3 min read

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

api/categorie-de-produit/schema.json
1
{
2
"kind": "collectionType",
3
"collectionName": "categorie_de_produits",
4
"info": {
5
"singularName": "categorie-de-produit", // ^? Identifiant unique
6
"pluralName": "categorie-de-produits",
7
"displayName": "Catégorie de produit"
8
},
9
"options": {
10
"draftAndPublish": true // ^? Permet le mode brouillon
11
},
12
"attributes": {
13
"name": {
14
"type": "string",
15
"required": true // @callout: Chaque catégorie doit avoir un nom
16
},
17
"products": {
18
"type": "relation",
19
"relation": "manyToMany",
20
"target": "api::produit.produit", // ^? Cible le modèle produit
21
"inversedBy": "categories" // @callout: Inverse the mapping
22
}
23
}
24
}

Explications clés

  • kind: "collectionType" indique que tu gères plusieurs entrées.
  • name est un champ simple string.
  • products établit une relation many-to-many avec le modèle produit.
  • inversedBy doit correspondre au champ categories du 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.

api/produit/schema.json
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": true
12
},
13
"attributes": {
14
"name": {
15
"type": "string",
16
"required": true
17
},
18
"description": {
19
"type": "text"
20
},
21
"price": {
22
"type": "integer",
23
"min": 0,
24
"default": 0
25
},
26
"image": {
27
"type": "media",
28
"multiple": false,
29
"allowedTypes": ["images"]
30
},
31
"slug": {
32
"type": "uid",
33
"targetField": "name",
34
"required": true
35
},
36
"categories": {
37
"type": "relation",
38
"relation": "manyToMany",
39
"target": "api::categorie-de-produit.categorie-de-produit",
40
"mappedBy": "products" // ^? Renvoie à la clé inversée
41
},
42
"stock": {
43
"type": "integer",
44
"default": 0,
45
"required": true
46
},
47
"devStripeProductId": {
48
"type": "string",
49
"unique": true,
50
"private": true
51
},
52
"stripeProductId": {
53
"type": "string",
54
"unique": true,
55
"private": true
56
}
57
}
58
}

Comprendre la relation many-to-many

  1. manyToMany côté catégorie : products inversedBy categories.
  2. manyToMany côté produit : categories mappedBy products.

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.


Points clés de la leçon

  • Chaque Content Type est un fichier JSON dans src/api/<type>/schema.json.
  • draftAndPublish active le cycle vie brouillon/publication.
  • Les relations manyToMany produisent une table de liaison transparente.
  • Utilise uid pour générer automatiquement un slug basé sur un champ cible.
  • Les attributs private ne sont pas exposés dans l’API publique.

Exercices rapides

  1. Crée un Content Type marque avec un champ name (string) et une relation one-to-many vers produit.
  2. Modifie le modèle produit pour ajouter un champ rating (decimal, min 0, max 5, default 0).
  3. Dans l’interface Strapi Admin, teste la création d’une catégorie et associe-y deux produits.

Liens utiles :