javascript - Cum să faci ca Prisma client să genereze tipuri de relații
Încerc să creez o relație de tipul unu-la-mulți între un utilizator și postări. Pot să creez schema bazei de date și pot să scriu/interoghez totul ok, dar se pare că clientul Prisma care este generat nu are relațiile pe tip.
De exemplu, schema mea arată astfel:
model User {
id Int @id @default(autoincrement())
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
author User @relation(fields: [authorId], references: [id])
authorId Int
}
Apoi rulez npx prisma generate care creează un client cu următoarele tipuri
/**
* Model User
*
*/
export type User = {
id: number
}
/**
* Model Post
*
*/
export type Post = {
id: number
authorId: number
}
M-aș aștepta ca tipul utilizatorului să arate așa:
export type User = {
id: number;
posts: Post[];
}
Mi-am definit schema Prisma corect? Ce trebuie să fac pentru ca tipul să includă relația?
Răspuns #1
În mod implicit, un tip Prisma nu va include câmpuri relaționale în „tipul” de bază. Dacă doriți să obțineți tipul pentru User care include Posts relaționate, clientul Prisma va include acest lucru pe baza structurii interogării dvs.
https://www.prisma.io/docs/concepts/components/prisma-client/select-fields
Poți folosi atributul include pe orice operațiune CRUD Prisma pentru ca clientul Prisma să returneze anumite câmpuri relaționale, ȘI acele câmpuri relaționate sunt incluse în tipul emis. Prisma se va ocupa de acest tipaj pentru tine!
const usersWithPosts = await prisma.user.findMany({
include: {
posts: true
}
});
// usersWithPosts has a type like this:
// Array<User & { posts: Array<Post> }>
========
EDIT: Dacă vrei să calculezi tipul în avans fără să vrei să scrii o interogare, poți folosi Prisma.UserGetPayload (sau unele alte forme de GetPayload, deoarece prefixul se va schimba în funcție de model).
type UserWithPosts = Prisma.UserGetPayload<{
include: {
posts: true;
};
}>;
Acesta emite următorul tip:
type UserWithPosts = User & {
posts: Post[];
}
