One-to-many relations
Prisma ORM v7How to define and work with one-to-many relations in Prisma.
One-to-many (1-n) relations connect one record on one side to zero or more records on the other side:
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
}This expresses:
- A user can have zero or more posts
- A post must always have an author
You can also reference a field other than the primary key. The referenced field on the parent model must be unique, so mark it with @unique (an @id field is already unique). To reference several fields at once, they must together form a @@id or @@unique; see Multi-field relations.
model User {
id Int @id @default(autoincrement())
email String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
authorEmail String
author User @relation(fields: [authorEmail], references: [email])
}Multi-field relations (relational databases only)
model User {
firstName String
lastName String
post Post[]
@@id([firstName, lastName])
}
model Post {
id Int @id @default(autoincrement())
author User @relation(fields: [authorFirstName, authorLastName], references: [firstName, lastName])
authorFirstName String
authorLastName String
}1-n in the database
The difference between 1-1 and 1-n is that in a 1-1 relation the foreign key must have a UNIQUE constraint. Without UNIQUE, multiple records can point to the same parent, making it 1-n.
Required vs optional relation fields
The annotated relation field and relation scalar can be either optional or mandatory. The list side is always mandatory.
Optional 1-n (can create Post without User):
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?
}Mandatory 1-n (must assign User when creating Post):
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
}