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
相关产品推荐
相关产品推荐

