跳至主要内容

选择字段

默认情况下,当查询返回记录(与计数相反)时,结果将包含 **默认选择集**

  • **所有** 在 Prisma 架构中定义的标量字段(包括枚举)
  • **没有** 任何关联

要自定义结果

选择你需要的字段和关联,而不是依赖于默认选择集,可以 ✔ 减少响应的大小,并且 ✔ 提高查询速度。

从版本 5.9.0 开始,在使用 include 进行关联查询或在关联字段上使用 select 时,你还可以指定 relationLoadStrategy 来决定是使用数据库级别的联接还是执行多个查询并在应用程序级别合并数据。此功能目前处于 预览 状态,你可以 在这里 了解更多信息。

示例架构

所有示例都基于以下架构

展开以查看示例架构
generator client {
provider = "prisma-client-js"
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

model ExtendedProfile {
id Int @id @default(autoincrement())
biography String
user User @relation(fields: [userId], references: [id])
userId Int @unique
}

model User {
id Int @id @default(autoincrement())
name String?
email String @unique
profileViews Int @default(0)
role Role @default(USER)
coinflips Boolean[]
posts Post[]
profile ExtendedProfile?
}

model Post {
id Int @id @default(autoincrement())
title String
published Boolean @default(true)
author User @relation(fields: [authorId], references: [id])
authorId Int
comments Json?
views Int @default(0)
likes Int @default(0)
categories Category[]
}

model Category {
id Int @id @default(autoincrement())
name String @unique
posts Post[]
}

enum Role {
USER
ADMIN
}

对于 **关系型数据库**,使用 db push 命令将示例架构推送到你自己的数据库

npx prisma db push

对于 **MongoDB**,确保你的数据形状统一,并与 Prisma 架构中定义的模型匹配。

返回默认选择集

以下查询返回默认选择集(所有标量字段,没有关联)

// Query returns User or null
const getUser: User | null = await prisma.user.findUnique({
where: {
id: 22,
},
})
显示查询结果
{
id: 22,
name: "Alice",
email: "[email protected]",
profileViews: 0,
role: "ADMIN",
coinflips: [true, false],
}

选择特定字段

使用 select 返回字段的有限子集,而不是所有字段。以下示例仅返回 emailname 字段

// Returns an object or null
const getUser: object | null = await prisma.user.findUnique({
where: {
id: 22,
},
select: {
email: true,
name: true,
},
})
显示查询结果
{
name: "Alice",
email: "[email protected]",
}

包含关联并选择关联字段

要返回 **特定关联字段**,你可以

  • 使用嵌套的 select
  • include 中使用 select

要返回 _所有_ 关联字段,仅使用 include - 例如,{ include: { posts: true } }

以下查询使用嵌套的 select 来选择每个用户的 name 和每个相关帖子的 title

const users = await prisma.user.findMany({
select: {
name: true,
posts: {
select: {
title: true,
},
},
},
})
显示查询结果
{
"name":"Sabelle",
"posts":[
{
"title":"Getting started with Azure Functions"
},
{
"title":"All about databases"
}
]
}

以下查询在 include 中使用 select,并返回 _所有_ 用户字段和每个帖子的 title 字段

const users = await prisma.user.findMany({
// Returns all user fields
include: {
posts: {
select: {
title: true,
},
},
},
})
显示查询结果
{
"id": 9
"name": "Sabelle",
"email": "[email protected]",
"profileViews": 90,
"role": "USER",
"profile": null,
"coinflips": [],
"posts":[
{
"title":"Getting started with Azure Functions"
},
{
"title":"All about databases"
}
]
}

有关查询关联的更多信息,请参阅以下文档

关联计数

3.0.1 及更高版本中,你可以 includeselect 关联的计数,连同字段一起 - 例如,用户的帖子计数。