You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS Prisma ORM 查询数据时select和include的区别是什么

Prisma中select与include的核心区别

两者最本质的差异:include仅用于关联表的加载,而select可以自定义返回的字段范围(既支持主表字段,也支持关联表字段)

1. include的具体作用

  • 只能用来指定是否加载主表关联的其他模型数据(比如你示例中user表关联的posts表),不会影响主表本身字段的返回规则
  • 只要使用了include,主表的所有默认字段(除了@ignore标记的字段)都会全部返回,只会额外把你指定的关联表数据追加到返回结果中
    你给出的include写法返回结构示例:
[
  {
    id: 1, // user主表所有字段默认全部返回
    name: '管理员1',
    role: 'ADMIN',
    email: 'admin@xxx.com',
    // 额外追加include指定的关联posts数据
    posts: [
      { id: 101, title: '文章1', content: 'xxx' },
      // ... 该用户关联的所有posts记录
    ]
  },
  // ... 其他ADMIN角色用户
]

2. select的具体作用

  • 用来显式指定你需要返回的所有字段,既可以选择主表字段,也可以选择关联表字段
  • 只要使用了select,只有你明确标记为true的字段才会返回,主表未指定的字段会全部被过滤掉
    你给出的select写法返回结构示例:
[
  {
    // 主表的id、name、role、email等所有字段都不会返回,因为没有在select中指定
    posts: [
      { id: 101, title: '文章1', content: 'xxx' },
      // ... 该用户关联的所有posts记录
    ]
  },
  // ... 其他ADMIN角色用户
]

如果需要同时返回主表指定字段+关联表数据,可以这样写:

const users = await prisma.user.findMany({
  where: { role: 'ADMIN' },
  select: {
    id: true,
    name: true,
    posts: true
  }
})

3. 适用场景选择

  • 如果你需要主表的全部字段,只需要额外加载关联数据,选include即可,代码更简洁
  • 如果你只需要主表的部分字段(比如避免返回密码、手机号等敏感字段),或者需要自定义关联表返回的字段范围,选select

注意:同一个查询配置中只能使用select或者include其中一个,不能同时写,会触发语法报错。

内容的提问来源于stack exchange,提问作者Vakindu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:54:05