node.js - NestJS Prisma ORM - Använda 'select' versus 'include' när man hämtar dataposter?
Jag försöker hämta dataposter från en Postgres-databas i NestJS (Node.JS-miljö).
Jag använder Prisma som min objekt-relationsmappare (ORM) i TypeScript.
Jag har problem med att välja vilken fråga jag ska använda när jag hämtar 'ADMIN'-användarposter.
Någon får gärna förklara skillnaden mellan att använda 'select' och att använda 'include' när man hämtar datarader (jag är nybörjare på Prisma - vänligen håll det enkelt).
Tack i förväg!
Koden ser ut som nedan:
Med hjälp av include:
const users = await prisma.user.findMany({
where: {
role: 'ADMIN',
},
include: {
posts: true,
},
})
Använder select:
const users = await prisma.user.findMany({
where: {
role: 'ADMIN',
},
select: {
posts: true,
},
})
Svar #1
Det förklaras i dokumentationen för Select-fält och Relationsfrågor att include och select har olika användning:
Som standard, när en fråga returnerar poster [..], inkluderar resultatet standardvalet:
Alla skalära fält som definieras i Prisma-schemat [..och] Ingen av relationerna
För att ändra detta beteende kan du använda:
(1) Välj:
tillåter dig att antingen returnera en begränsad delmängd av fält istället för alla fält:
const getUser: object | null = await prisma.user.findUnique({
where: {
id: 22,
},
select: {
email: true,
name: true,
},
})
// Result
{
name: "Alice",
email: "[email ",
}
eller inkludera relationer och välja relationsfält (nästlad användning):
const users = await prisma.user.findMany({
select: {
name: true,
posts: {
select: {
title: true,
},
},
},
})
(2) Inkludera:
låter dig returnera några eller alla relationsfält (som inte returneras som standard, som nämnts tidigare):
const getPosts = await prisma.post.findMany({
where: {
title: {
contains: 'cookies',
},
},
include: {
author: true, // Return all fields
},
})
// Result:
;[
{
id: 17,
title: 'How to make cookies',
published: true,
authorId: 16,
comments: null,
views: 0,
likes: 0,
author: {
id: 16,
name: null,
email: '[email ',
profileViews: 0,
role: 'USER',
coinflips: [],
},
},
{
id: 21,
title: 'How to make cookies',
published: true,
authorId: 19,
comments: null,
views: 0,
likes: 0,
author: {
id: 19,
name: null,
email: '[email ',
profileViews: 0,
role: 'USER',
coinflips: [],
},
},
]
(3) Välj inom Inkludera:
Slutligen kan du använda Select inom Include för att returnera ett delmängd av relationsfälten.
const users = await prisma.user.findMany({
// Returns all user fields
include: {
posts: {
select: {
title: true,
},
},
},
})
