繁体   English   中英

prisma findUnique 只接受一个唯一参数

[英]prisma findUnique where takes only one unique argument

我遇到了一个问题,我需要通过用户名和 email 检查用户是否存在,因为两者都是数据库中的唯一字段,但出现错误。 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 返回一个 JS object...所以也许这样的查询应该有效:

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

我相信这应该可行,但它仍然只能找到一个独特的。 我不确定你为什么会 select 用户 + email 都是独一无二的,因为我假设一个无论如何都与另一个相关联。

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

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

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

但是让我们假设 email 或单独的用户名不是唯一的,并且 email 和用户名的组合是唯一的。

修改如下所示的架构

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

您现在可以通过唯一的 email 和用户名进行查询,而无需提供多个 where arguments

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

参考:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM