309 lines
4.3 KiB
Markdown
309 lines
4.3 KiB
Markdown
# Relation Queries
|
|
|
|
Query and modify related records.
|
|
|
|
## Include Relations
|
|
|
|
Load related records:
|
|
|
|
```typescript
|
|
const user = await prisma.user.findUnique({
|
|
where: { id: 1 },
|
|
include: {
|
|
posts: true,
|
|
profile: true
|
|
}
|
|
})
|
|
```
|
|
|
|
### Filtered include
|
|
|
|
```typescript
|
|
const user = await prisma.user.findUnique({
|
|
where: { id: 1 },
|
|
include: {
|
|
posts: {
|
|
where: { published: true },
|
|
orderBy: { createdAt: 'desc' },
|
|
take: 5,
|
|
select: { id: true, title: true }
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### Nested include
|
|
|
|
```typescript
|
|
const user = await prisma.user.findUnique({
|
|
where: { id: 1 },
|
|
include: {
|
|
posts: {
|
|
include: {
|
|
comments: {
|
|
include: { author: true }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
## Select Relations
|
|
|
|
```typescript
|
|
const user = await prisma.user.findUnique({
|
|
where: { id: 1 },
|
|
select: {
|
|
name: true,
|
|
posts: {
|
|
select: { title: true }
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
## Nested Writes
|
|
|
|
### Create with relations
|
|
|
|
```typescript
|
|
const user = await prisma.user.create({
|
|
data: {
|
|
email: 'alice@prisma.io',
|
|
posts: {
|
|
create: [
|
|
{ title: 'Post 1' },
|
|
{ title: 'Post 2' }
|
|
]
|
|
},
|
|
profile: {
|
|
create: { bio: 'Hello!' }
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### Create or connect
|
|
|
|
```typescript
|
|
const post = await prisma.post.create({
|
|
data: {
|
|
title: 'New Post',
|
|
author: {
|
|
connectOrCreate: {
|
|
where: { email: 'alice@prisma.io' },
|
|
create: { email: 'alice@prisma.io', name: 'Alice' }
|
|
}
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### Connect existing
|
|
|
|
```typescript
|
|
const post = await prisma.post.create({
|
|
data: {
|
|
title: 'New Post',
|
|
author: {
|
|
connect: { id: 1 }
|
|
}
|
|
}
|
|
})
|
|
|
|
// Shorthand for foreign key
|
|
const post = await prisma.post.create({
|
|
data: {
|
|
title: 'New Post',
|
|
authorId: 1
|
|
}
|
|
})
|
|
```
|
|
|
|
## Update Relations
|
|
|
|
### Update related records
|
|
|
|
```typescript
|
|
const user = await prisma.user.update({
|
|
where: { id: 1 },
|
|
data: {
|
|
posts: {
|
|
update: {
|
|
where: { id: 1 },
|
|
data: { title: 'Updated Title' }
|
|
}
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### Update many related
|
|
|
|
```typescript
|
|
const user = await prisma.user.update({
|
|
where: { id: 1 },
|
|
data: {
|
|
posts: {
|
|
updateMany: {
|
|
where: { published: false },
|
|
data: { published: true }
|
|
}
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### Upsert related
|
|
|
|
```typescript
|
|
const user = await prisma.user.update({
|
|
where: { id: 1 },
|
|
data: {
|
|
profile: {
|
|
upsert: {
|
|
create: { bio: 'New bio' },
|
|
update: { bio: 'Updated bio' }
|
|
}
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### Disconnect
|
|
|
|
```typescript
|
|
// 1-to-1 optional
|
|
const user = await prisma.user.update({
|
|
where: { id: 1 },
|
|
data: {
|
|
profile: { disconnect: true }
|
|
}
|
|
})
|
|
|
|
// Many-to-many
|
|
const post = await prisma.post.update({
|
|
where: { id: 1 },
|
|
data: {
|
|
tags: {
|
|
disconnect: [{ id: 1 }, { id: 2 }]
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### Delete related
|
|
|
|
```typescript
|
|
const user = await prisma.user.update({
|
|
where: { id: 1 },
|
|
data: {
|
|
posts: {
|
|
delete: { id: 1 }
|
|
}
|
|
}
|
|
})
|
|
|
|
// Delete many
|
|
const user = await prisma.user.update({
|
|
where: { id: 1 },
|
|
data: {
|
|
posts: {
|
|
deleteMany: { published: false }
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### Set (replace all)
|
|
|
|
```typescript
|
|
// Replace all related records
|
|
const post = await prisma.post.update({
|
|
where: { id: 1 },
|
|
data: {
|
|
tags: {
|
|
set: [{ id: 1 }, { id: 2 }]
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
## Relation Filters
|
|
|
|
### some
|
|
|
|
At least one matches:
|
|
|
|
```typescript
|
|
const users = await prisma.user.findMany({
|
|
where: {
|
|
posts: { some: { published: true } }
|
|
}
|
|
})
|
|
```
|
|
|
|
### every
|
|
|
|
All match:
|
|
|
|
```typescript
|
|
const users = await prisma.user.findMany({
|
|
where: {
|
|
posts: { every: { published: true } }
|
|
}
|
|
})
|
|
```
|
|
|
|
### none
|
|
|
|
None match:
|
|
|
|
```typescript
|
|
const users = await prisma.user.findMany({
|
|
where: {
|
|
posts: { none: { published: true } }
|
|
}
|
|
})
|
|
```
|
|
|
|
### is / isNot (1-to-1)
|
|
|
|
```typescript
|
|
const users = await prisma.user.findMany({
|
|
where: {
|
|
profile: { is: { country: 'USA' } }
|
|
}
|
|
})
|
|
```
|
|
|
|
## Count Relations
|
|
|
|
```typescript
|
|
const users = await prisma.user.findMany({
|
|
select: {
|
|
name: true,
|
|
_count: {
|
|
select: { posts: true, followers: true }
|
|
}
|
|
}
|
|
})
|
|
// { name: 'Alice', _count: { posts: 5, followers: 100 } }
|
|
```
|
|
|
|
### Filter counted relations
|
|
|
|
```typescript
|
|
const users = await prisma.user.findMany({
|
|
select: {
|
|
name: true,
|
|
_count: {
|
|
select: {
|
|
posts: { where: { published: true } }
|
|
}
|
|
}
|
|
}
|
|
})
|
|
```
|