Maison  >  Questions et réponses  >  le corps du texte

Ajouter automatiquement l'ID de l'utilisateur connecté au champ de clé étrangère KeystoneJS

Je crée une application en utilisant la documentation fournie par le framework KeystoneJS. Ainsi, dans mon application, j'ai deux tables, l'une est Users et l'autre est Posts. Donc, je me demande, lorsque je crée une publication en me connectant à la zone d'administration, il y a un champ avec une colonne de clé étrangère, et ce champ est vide pour être rempli avec la valeur de clé étrangère de la table des utilisateurs. Ainsi, lorsque je crée une nouvelle publication en utilisant l'identifiant de l'utilisateur connecté dans KeystoneJS, je souhaite que le système ajoute automatiquement la valeur de la clé étrangère à auteur.

J'ai donc cherché partout une solution mais je n'ai pas trouvé de solution adaptée.

Si quelqu'un a des idées à ce sujet, il serait grandement apprécié qu'il puisse répondre à cette question.

Merci

P粉239164234P粉239164234401 Il y a quelques jours632

répondre à tous(1)je répondrai

  • P粉949190972

    P粉9491909722023-09-15 10:10:38

    Avez-vous vu l'Exemple de blog contrôlé ?

    Il a une liste similaire à votre projet : PostsUsers,可以是ContributorsModerators。在你的情况下,贡献者/管理员的区别并不重要,你会对Post列表上的钩子感兴趣,特别是resolveInput.createHooks, elle ressemble à ceci :

    hooks: {
      resolveInput: {
        create: ({ context, resolvedData }) => {
          resolvedData.createdAt = new Date();
          if (context.session?.contributor) {
            return {
              ...resolvedData,
              createdBy: {
                connect: {
                  id: context.session?.contributor?.id,
                },
              },
            };
          }
          return resolvedData;
        },
      },
      // 其他钩子...
    },

    Selon Documentation :

    C'est donc notre opportunité de modifier la valeur avant de sauvegarder, notamment en remplissant ou en forçant une valeur comme votre champ Post.author.

    resolveInput Obtient l'objet context resolveInput获取context对象,其中包括对session对象的引用。该对象的内容由你的会话存储函数决定,但通常包含有关当前用户的信息。在这个示例中,如果登录的用户是贡献者,我们从context.session?.contributor?.id获取他们的贡献者ID,并将其保存到createdBy字段。同时,createdAt, qui inclut la référence A à l'objet session. Le contenu de cet objet est déterminé par votre fonction de stockage de session

    , mais contient généralement des informations sur le informations actuelles sur l'utilisateur. Dans cet exemple, si l'utilisateur connecté est un contributeur, nous obtenons son identifiant de contributeur à partir de context.session?.contributor?.id et l'enregistrons dans createdByField. Dans le même temps, le champ createdAt est également défini sur la date et l'heure actuelles.

    resolvedData对象和钩子想要进行的任何其他更改)。另一种方法是在字段级别添加resolvedData函数,但这样我们就需要两个单独的函数 - 一个用于createdAt,另一个用于createdByNotez que puisque ce hook est configuré au niveau de la liste, il doit renvoyer des données pour l'élément entier (en gros - chaque fonction renvoie une valeur unique. Pour plus d'informations sur cette différence, consultez le Hooks Guide

    .

    De plus, il est important de ne pas confondre les hooks avec le Contrôle d'accèsaccess - c'est-à-dire si un contributeur doit être autorisé à créer une publication en premier lieu. Dans cet exemple, le contrôle d'accès est configuré séparément, dans la configuration

    de la liste.

    Une dernière remarque : au moment de la rédaction, la documentation de l'API Hooks resolveInput钩子(在列表和字段级别),但没有将其分解为不同的操作(即resolveInput.createresolveInput.updatecouvre

    ). Il s'agit simplement d'une amélioration récente de la syntaxe, cela ne change pas la façon dont les hooks sont utilisés. Si vous utilisez uniquement l'API dans la documentation, le code ci-dessus peut s'écrire ainsi : 🎜
    hooks: {
      resolveInput: ({ operation, context, resolvedData }) => {
        // 仅对创建操作运行(忽略更新)
        if (operation !== 'create') return resolvedData;
        resolvedData.createdAt = new Date();
        if (context.session?.contributor) {
          return {
            ...resolvedData,
            createdBy: {
              connect: {
                id: context.session?.contributor?.id,
              },
            },
          };
        }
        return resolvedData;
      },
      // 其他钩子...
    },

    répondre
    0
  • Annulerrépondre