web-dev-qa-db-fra.com

Comprendre le fonctionnement des relations strapi

Je suis nouveau sur strapi et en général avec le développement back-end et j'essaie de comprendre comment de très petites choses devraient fonctionner.

J'ai un modèle utilisateur, un modèle profil et un modèle tarifaire.

Un utilisateur peut avoir un profil, j'ai donc créé une relation has and belongs to one. Un profil peut avoir un tarif et j'ai créé la même relation entre profil et tarif.

Ce que j'ai remarqué ici, c'est:

Quand dans le client j'atterris dans la section du profil, je le sauvegarde avec toutes ses propriétés comme: nom, prénom, adresse, etc ... et tout se passe bien en y ajoutant l'ID utilisateur.

Le point ici est que dans la même section de profil, j'ai également des entrées de tarifs et ce que je voudrais faire est d'enregistrer les tarifs en enregistrant le profil et en n'ajoutant pas de bouton de sauvegarde spécial uniquement pour les tarifs ...

Est-il possible de faire quelque chose ou est-ce que je fais quelque chose de mal ici?

Je sépare les tarifs par profil pour pouvoir mieux trouver, organiser et travailler avec les tarifs sans interroger les profils à chaque fois mais ayant des enregistrements de profil par id ro quelque chose ...

Quelqu'un peut-il expliquer clairement la meilleure approche et que dois-je faire pour la réaliser correctement? Merci

8
Ayeye Brazo

Le Form

Entrée HTML pour créer données json imbriquées vous pouvez créer un formulaire et tester la sortie

<form action="profiles" method="POST" accept-charset="utf-8">
  <input type="text" name="name" value="MyProfileName" />
  <input type="text" name="fare[name]" value="MyProfileFareName" />
</form>

Analyser le parameters

Les paramètres seront reçus de votre backend en tant que

name=MyProfileName&fare[name]=MyProfileFareName

Le contrôleur analysera les paramètres ci-dessus comme json

{
  'profile' => {
    'name' => 'MyProfileName',
    'fare' => {
        'name' => 'MyProfileFareName',
    }
  }
}

L'action create ou update du contrôleur

Le contrôleur doit être responsable de l'utilisation des paramètres reçus et de la mise à jour des modèles de base de données. Les méthodes add et edit pour conserver le model dans le database sont définies à l'intérieur des objets services (pas à l'intérieur du contrôleur), la responsabilité du contrôleur est uniquement d'appeler ces méthodes.

Vous pouvez récupérer le parameters dans le body du request. L'objet request est disponible dans le contrôleur ctx.request

Comme dans cet exemple l'action createtilise le .add méthode de la classe de services category . Les api docs n'ont aucune explication à ce sujet et vous devez suivre l'exemple sur github .

module.exports = {
  // POST /profiles
  create: async (ctx) => {
    // use the fare service to add a new entry with value request.body.fare
    var profile = strapi.services.profile.add(ctx.request.body)
    strapi.services.fare.add(ctx.request.body.fare)
    return profile 
  }
};

Les méthodes Profile service add et edit

vous pouvez consulter les exemples sur github pour mieux comprendre la logique des méthodes add et edit.

add: async (values) => {
    // Extract values related to relational data.
    const relations = _.pick(values, Profile.associations.map(ast => ast.alias));
    const data = _.omit(values, Profile.associations.map(ast => ast.alias));

    // Create entry with no-relational data.
    const entry = await Profile.create(data);

    // Create relational data and return the entry.
    return Profile.updateRelations({ _id: entry.id, values: relations });
},
4