Prisma客户端查询最新版本。

13

假设有以下模式。如何使用prisma2客户端查询每个存储库的最新提交?

model Commit {
  id   String   @default(uuid()) @id
  date DateTime @default(now())
}

model Branch {
  id           String     @default(uuid()) @id
  commit       Commit     @relation(fields: [commitId],references: [id])
  commitId     String
  repository   Repository @relation(fields: [repositoryId],references: [id])
  repositoryId String
}

model Repository {
  id String @default(uuid()) @id
}

2个回答

19

我认为您的架构应该更像这样:

model Commit {
  id        String   @default(uuid()) @id
  branch    Branch   @relation(fields: [branchId], references: [id])
  createdAt DateTime @default(now())
  branchId  String
}

model Branch {
  id           String     @default(uuid()) @id
  name         String
  repository   Repository @relation(fields: [repositoryId], references: [id])
  commits      Commit[]
  repositoryId String
}

model Repository {
  id     String   @default(uuid()) @id
  branch Branch[]
}

您可以通过这种方式获取存储库中所有分支的最新提交:

await prisma.repository.findMany({
    select: {
      branch: {
        select: {
          name: true,
          commits: {
            orderBy: {
              createdAt: 'desc',
            },
            take: 1,
          },
        },
      },
    },
  })

1
在这种情况下,使用 Prisma 的 findFirst 方法不是更好吗? - theveloptg

0
要获取最后一个元素,您的模型中必须有id(Int)。因此,您可以通过id调用最后一个元素。至少因为您选择了findMany,它将返回一个数组,通过在代码末尾添加[0]来选择第一个元素:
const latestQuery = await prisma.modelName.findMany({
        orderBy: {
            id: 'desc',
        },
        take: 1,
})

如果你没有添加where,它将返回最后一个元素,而不带任何条件,但是如果你想要添加条件比如名称等于"some name"且年龄为25等等,你可以在where中添加它:
const latestQuery = await prisma.modelName.findMany({
    where:{
        name: "some name",
        age: 25
    },
    orderBy: {
        id: 'desc',
    },
    take: 1,
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接