prisma findUnique where 只需要一个唯一的参数

prisma findUnique where takes only one unique argument

我 运行 遇到了一个问题,我需要通过用户名和电子邮件来检查用户是否存在,因为这两者都是数据库中的唯一字段,但我遇到了一个错误。 Argument where of type UserWhereUniqueInput needs exactly one argument, but you provided username and email. Please choose one. 那么,有没有办法只执行一次这个查询?而不是像下面这样 运行 每个人一个

const user = await prisma.user.findUnique({
        where: {
          username,
          email,
        },
      });

而不是这样

const user = await prisma.user.findUnique({
        where: {
          username,
        },
      });

const user = await prisma.user.findUnique({
        where: {
          email,
        },
      });

我不是很确定,但是 prisma returns 一个 JS 对象... 所以也许像这样的查询应该有效:

const query = await prisma.user.findUnique({
        where: {
          user: user.username
        },
       select: {
         user: true,
         email: true
      }
      });

我相信这应该可行,但它仍然只能找到一个唯一的。我不确定为什么 select user + email 都是唯一的,因为我认为无论如何都与另一个相关联。

如果我的解决方案无法工作,我会在这里查看更多答案:https://www.prisma.io/docs/concepts/components/prisma-client/crud#findfirst

const users = await prisma.user.findMany({
       where: {
        OR: [
          {username},
          {email}
        ]
      }
  });
 if (users.length !== 0) {...}

如果您正在寻找可以为您带来单一结果的唯一值,您也可以使用 findFirst。这会给你对象而不是数组。 findMany returns 一个数组,即使您正在寻找唯一值。

const users = await prisma.user.findFirst({
 where: {OR: [{username},{email}]}
});

从逻辑上讲,email是一个唯一的字段(不会有两个人共享的相同的email)。用户名字段不是唯一的(多个用户具有相同的名称)。
仅以下代码就足以获取该唯一用户。

const user = await prisma.user.findUnique({
        where: {
          email
        },
      });

但我们假设电子邮件或用户名本身不是唯一的,电子邮件和用户名的组合是唯一的。

修改如下所示的架构

model user {
  username : String
  email    : String
  @@unique([username, email])
}

您现在可以通过唯一的电子邮件和用户名进行查询,而无需提供多个 where 参数

   const user = await prisma.findUnique({
        where: {
          username_email : { username, email },
        },
      });

参考文献: