我有两个表,User
和Relationship
。这些表用于存储父子关系。我在用Postgres
// schema.sql
CREATE TABLE "public"."Relationships" (
id SERIAL PRIMARY KEY NOT NULL,
parent_id INT NOT NULL,
FOREIGN KEY (parent_id) REFERENCES "User" (id),
child_id INT NOT NULL,
FOREIGN KEY (child_id) REFERENCES "User" (id)
)
CREATE TABLE "public"."User" (
id SERIAL PRIMARY KEY NOT NULL,
name VARCHAR(128) NOT NULL,
email VARCHAR(128) UNIQUE,
password VARCHAR(128) NOT NULL,
isChild BOOLEAN NOT NULL DEFAULT false
created_at TIMESTAMP NOT NULL DEFAULT NOW();
);
当我运行npx prisma introspect
时,schema.prisma
文件中将返回以下内容。
// schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Relationships {
child_id Int
id Int @default(autoincrement()) @id
parent_id Int
User_Relationships_child_idToUser User @relation("Relationships_child_idToUser", fields: [child_id], references: [id])
User_Relationships_parent_idToUser User @relation("Relationships_parent_idToUser", fields: [parent_id], references: [id])
}
model User {
created_at DateTime @default(now())
email String? @unique
id Int @default(autoincrement()) @id
ischild Boolean @default(false)
name String?
password String
Relationships_Relationships_child_idToUser Relationships[] @relation("Relationships_child_idToUser")
Relationships_Relationships_parent_idToUser Relationships[] @relation("Relationships_parent_idToUser")
}
我不明白什么是,为什么User_Relationships_child_idToUser
以及User_Relationships_parent_idToUser
它们为什么不只是Prisma文档教程中为外键显示的简单语法。
Prisma的自省会为每个外键生成两个字段:
@relation
属性) -这些似乎迷惑你的字段。它们提供的原因是,您可以在Prisma Client API中轻松处理这些关系。您可以在文档中找到有关此信息的更多信息 此处。
当然,User_Relationships_parent_idToUser
和User_Relationships_child_idToUser
是不是很漂亮的名字。内省之后,您可以手动调整架构,并将关系字段重命名为更友好的名称,例如:
model Relationships {
child_id Int
id Int @default(autoincrement()) @id
parent_id Int
child User @relation("Relationships_child_idToUser", fields: [child_id], references: [id])
parent User @relation("Relationships_parent_idToUser", fields: [parent_id], references: [id])
}
为什么示例代码显示得更简单?
您确切指的是哪个示例代码?我猜这里有一个很大的不同是,在您的示例中,和之间有两个关系(因为定义了两个外键),而大多数示例代码段仅使用一个外键。
User
Relationship
我指的是从头开始的prisma.io教程。您的建议虽然很有道理。