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,
      },
    },
  },
})

Relaterade artiklar