@kood/claude-code 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +297 -0
- package/package.json +47 -0
- package/templates/hono/CLAUDE.md +376 -0
- package/templates/hono/docs/deployment/cloudflare.md +328 -0
- package/templates/hono/docs/deployment/index.md +291 -0
- package/templates/hono/docs/git/index.md +180 -0
- package/templates/hono/docs/library/hono/error-handling.md +400 -0
- package/templates/hono/docs/library/hono/index.md +241 -0
- package/templates/hono/docs/library/hono/middleware.md +334 -0
- package/templates/hono/docs/library/hono/rpc.md +454 -0
- package/templates/hono/docs/library/hono/validation.md +328 -0
- package/templates/hono/docs/library/prisma/index.md +427 -0
- package/templates/hono/docs/library/zod/index.md +413 -0
- package/templates/hono/docs/mcp/context7.md +106 -0
- package/templates/hono/docs/mcp/index.md +94 -0
- package/templates/hono/docs/mcp/sequential-thinking.md +101 -0
- package/templates/hono/docs/mcp/sgrep.md +105 -0
- package/templates/hono/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +136 -0
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +303 -0
- package/templates/tanstack-start/CLAUDE.md +279 -0
- package/templates/tanstack-start/docs/architecture/architecture.md +547 -0
- package/templates/tanstack-start/docs/deployment/cloudflare.md +346 -0
- package/templates/tanstack-start/docs/deployment/index.md +102 -0
- package/templates/tanstack-start/docs/deployment/nitro.md +211 -0
- package/templates/tanstack-start/docs/deployment/railway.md +364 -0
- package/templates/tanstack-start/docs/deployment/vercel.md +287 -0
- package/templates/tanstack-start/docs/design/accessibility.md +433 -0
- package/templates/tanstack-start/docs/design/color.md +235 -0
- package/templates/tanstack-start/docs/design/components.md +409 -0
- package/templates/tanstack-start/docs/design/index.md +107 -0
- package/templates/tanstack-start/docs/design/safe-area.md +317 -0
- package/templates/tanstack-start/docs/design/spacing.md +341 -0
- package/templates/tanstack-start/docs/design/tailwind-setup.md +470 -0
- package/templates/tanstack-start/docs/design/typography.md +324 -0
- package/templates/tanstack-start/docs/git/index.md +203 -0
- package/templates/tanstack-start/docs/guides/best-practices.md +753 -0
- package/templates/tanstack-start/docs/guides/getting-started.md +304 -0
- package/templates/tanstack-start/docs/guides/husky-lint-staged.md +303 -0
- package/templates/tanstack-start/docs/guides/prettier.md +189 -0
- package/templates/tanstack-start/docs/guides/project-templates.md +710 -0
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +136 -0
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +138 -0
- package/templates/tanstack-start/docs/library/better-auth/index.md +83 -0
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +111 -0
- package/templates/tanstack-start/docs/library/better-auth/session.md +127 -0
- package/templates/tanstack-start/docs/library/better-auth/setup.md +123 -0
- package/templates/tanstack-start/docs/library/prisma/crud.md +218 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +165 -0
- package/templates/tanstack-start/docs/library/prisma/relations.md +191 -0
- package/templates/tanstack-start/docs/library/prisma/schema.md +177 -0
- package/templates/tanstack-start/docs/library/prisma/setup.md +156 -0
- package/templates/tanstack-start/docs/library/prisma/transactions.md +140 -0
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +196 -0
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +110 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +170 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +173 -0
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +171 -0
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +114 -0
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +142 -0
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +163 -0
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +128 -0
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +85 -0
- package/templates/tanstack-start/docs/library/zod/basic-types.md +186 -0
- package/templates/tanstack-start/docs/library/zod/complex-types.md +204 -0
- package/templates/tanstack-start/docs/library/zod/index.md +186 -0
- package/templates/tanstack-start/docs/library/zod/transforms.md +174 -0
- package/templates/tanstack-start/docs/library/zod/validation.md +208 -0
- package/templates/tanstack-start/docs/mcp/context7.md +204 -0
- package/templates/tanstack-start/docs/mcp/index.md +116 -0
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +180 -0
- package/templates/tanstack-start/docs/mcp/sgrep.md +174 -0
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +150 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +293 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Prisma - CRUD 작업
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [Prisma](./index.md)
|
|
4
|
+
|
|
5
|
+
## Create (생성)
|
|
6
|
+
|
|
7
|
+
### 단일 레코드 생성
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
const user = await prisma.user.create({
|
|
11
|
+
data: {
|
|
12
|
+
email: 'alice@prisma.io',
|
|
13
|
+
name: 'Alice',
|
|
14
|
+
},
|
|
15
|
+
})
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### 관계 포함 생성
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
const userWithPosts = await prisma.user.create({
|
|
22
|
+
data: {
|
|
23
|
+
email: 'bob@prisma.io',
|
|
24
|
+
name: 'Bob',
|
|
25
|
+
posts: {
|
|
26
|
+
create: [
|
|
27
|
+
{ title: 'Hello World' },
|
|
28
|
+
{ title: 'My Second Post' },
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
include: {
|
|
33
|
+
posts: true,
|
|
34
|
+
},
|
|
35
|
+
})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### connectOrCreate로 깊은 중첩 생성
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
const user = await prisma.user.create({
|
|
42
|
+
include: {
|
|
43
|
+
posts: {
|
|
44
|
+
include: {
|
|
45
|
+
categories: true,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
data: {
|
|
50
|
+
email: 'emma@prisma.io',
|
|
51
|
+
posts: {
|
|
52
|
+
create: [
|
|
53
|
+
{
|
|
54
|
+
title: 'My first post',
|
|
55
|
+
categories: {
|
|
56
|
+
connectOrCreate: [
|
|
57
|
+
{
|
|
58
|
+
create: { name: 'Introductions' },
|
|
59
|
+
where: { name: 'Introductions' },
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
create: { name: 'Social' },
|
|
63
|
+
where: { name: 'Social' },
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
})
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Read (조회)
|
|
75
|
+
|
|
76
|
+
### 단일 레코드 조회
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
const user = await prisma.user.findUnique({
|
|
80
|
+
where: { email: 'alice@prisma.io' },
|
|
81
|
+
})
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 필터링된 다중 레코드 조회
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
const users = await prisma.user.findMany({
|
|
88
|
+
where: { name: 'Alice' },
|
|
89
|
+
})
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 관계 포함 조회
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
const users = await prisma.user.findMany({
|
|
96
|
+
where: { role: 'ADMIN' },
|
|
97
|
+
include: { posts: true },
|
|
98
|
+
})
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 특정 필드만 선택
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
const user = await prisma.user.findUnique({
|
|
105
|
+
where: { email: 'emma@prisma.io' },
|
|
106
|
+
select: {
|
|
107
|
+
email: true,
|
|
108
|
+
posts: {
|
|
109
|
+
select: { likes: true },
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
})
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 관계 필드로 필터링
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
const users = await prisma.user.findMany({
|
|
119
|
+
where: {
|
|
120
|
+
email: { endsWith: 'prisma.io' },
|
|
121
|
+
posts: {
|
|
122
|
+
some: { published: false },
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
})
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Update (수정)
|
|
129
|
+
|
|
130
|
+
### 단일 레코드 수정
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
const user = await prisma.user.update({
|
|
134
|
+
where: { email: 'alice@prisma.io' },
|
|
135
|
+
data: { name: 'Alice Updated' },
|
|
136
|
+
})
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 다중 레코드 수정
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
const updatedUsers = await prisma.user.updateMany({
|
|
143
|
+
where: { role: 'USER' },
|
|
144
|
+
data: { role: 'ADMIN' },
|
|
145
|
+
})
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Upsert (있으면 수정, 없으면 생성)
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
const user = await prisma.user.upsert({
|
|
152
|
+
where: { email: 'alice@prisma.io' },
|
|
153
|
+
update: { name: 'Alice Updated' },
|
|
154
|
+
create: { email: 'alice@prisma.io', name: 'Alice' },
|
|
155
|
+
})
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Delete (삭제)
|
|
159
|
+
|
|
160
|
+
### 단일 레코드 삭제
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
const deletedUser = await prisma.user.delete({
|
|
164
|
+
where: { email: 'alice@prisma.io' },
|
|
165
|
+
})
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 모든 레코드 삭제
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
const deleteUsers = await prisma.user.deleteMany({})
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 조건부 삭제
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
const deletedPosts = await prisma.post.deleteMany({
|
|
178
|
+
where: { published: false },
|
|
179
|
+
})
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## 필터 연산자
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
// 문자열 필터
|
|
186
|
+
where: {
|
|
187
|
+
email: { contains: 'prisma' },
|
|
188
|
+
name: { startsWith: 'A' },
|
|
189
|
+
title: { endsWith: 'guide' },
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// 숫자 필터
|
|
193
|
+
where: {
|
|
194
|
+
age: { gt: 18 }, // greater than
|
|
195
|
+
age: { gte: 18 }, // greater than or equal
|
|
196
|
+
age: { lt: 65 }, // less than
|
|
197
|
+
age: { lte: 65 }, // less than or equal
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// 배열 필터
|
|
201
|
+
where: {
|
|
202
|
+
id: { in: [1, 2, 3] },
|
|
203
|
+
id: { notIn: [4, 5, 6] },
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// 논리 연산자
|
|
207
|
+
where: {
|
|
208
|
+
OR: [
|
|
209
|
+
{ email: { contains: 'prisma' } },
|
|
210
|
+
{ name: { contains: 'Prisma' } },
|
|
211
|
+
],
|
|
212
|
+
AND: [
|
|
213
|
+
{ published: true },
|
|
214
|
+
{ authorId: 1 },
|
|
215
|
+
],
|
|
216
|
+
NOT: { email: { contains: 'test' } },
|
|
217
|
+
}
|
|
218
|
+
```
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Prisma
|
|
2
|
+
|
|
3
|
+
> **Version**: 7.x | Node.js/TypeScript ORM
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🚀 Quick Reference (복사용)
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// Prisma Client 설정
|
|
11
|
+
import { PrismaClient } from './generated/prisma' // v7 경로!
|
|
12
|
+
|
|
13
|
+
export const prisma = new PrismaClient()
|
|
14
|
+
|
|
15
|
+
// CRUD
|
|
16
|
+
const users = await prisma.user.findMany()
|
|
17
|
+
const user = await prisma.user.create({ data: { email, name } })
|
|
18
|
+
const updated = await prisma.user.update({ where: { id }, data: { name } })
|
|
19
|
+
const deleted = await prisma.user.delete({ where: { id } })
|
|
20
|
+
|
|
21
|
+
// 관계 포함
|
|
22
|
+
const userWithPosts = await prisma.user.findUnique({
|
|
23
|
+
where: { id },
|
|
24
|
+
include: { posts: true },
|
|
25
|
+
})
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### v7 schema.prisma (⚠️ 중요)
|
|
29
|
+
|
|
30
|
+
```prisma
|
|
31
|
+
generator client {
|
|
32
|
+
provider = "prisma-client" // v7! (prisma-client-js 아님)
|
|
33
|
+
output = "../generated/prisma" // output 필수!
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### ⛔ Claude Code 금지
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
❌ prisma db push 자동 실행 금지
|
|
41
|
+
❌ prisma migrate 자동 실행 금지
|
|
42
|
+
❌ prisma generate 자동 실행 금지
|
|
43
|
+
❌ schema.prisma 임의 변경 금지
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 문서 구조
|
|
49
|
+
|
|
50
|
+
- [설치 및 설정](./setup.md) - Prisma Client 설정
|
|
51
|
+
- [스키마 정의](./schema.md) - 모델, 관계, Enum 정의
|
|
52
|
+
- [CRUD 작업](./crud.md) - Create, Read, Update, Delete
|
|
53
|
+
- [관계 쿼리](./relations.md) - 중첩 생성, 관계 포함 조회
|
|
54
|
+
- [트랜잭션](./transactions.md) - 배열 기반 트랜잭션, 인터랙티브 트랜잭션
|
|
55
|
+
|
|
56
|
+
## 빠른 시작
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# npm
|
|
60
|
+
npm install @prisma/client@7
|
|
61
|
+
npm install -D prisma@7
|
|
62
|
+
|
|
63
|
+
# yarn
|
|
64
|
+
yarn add @prisma/client@7
|
|
65
|
+
yarn add -D prisma@7
|
|
66
|
+
|
|
67
|
+
# pnpm
|
|
68
|
+
pnpm add @prisma/client@7
|
|
69
|
+
pnpm add -D prisma@7
|
|
70
|
+
|
|
71
|
+
# 초기화
|
|
72
|
+
npx prisma init
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## v7 주요 변경사항
|
|
76
|
+
|
|
77
|
+
### 새로운 Generator Provider
|
|
78
|
+
|
|
79
|
+
```prisma
|
|
80
|
+
// schema.prisma
|
|
81
|
+
generator client {
|
|
82
|
+
provider = "prisma-client" // prisma-client-js → prisma-client
|
|
83
|
+
output = "../generated/prisma" // output 필드 필수
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 새로운 옵션들
|
|
88
|
+
|
|
89
|
+
```prisma
|
|
90
|
+
generator client {
|
|
91
|
+
provider = "prisma-client"
|
|
92
|
+
output = "../generated/prisma"
|
|
93
|
+
runtime = "nodejs" // nodejs, deno, bun, workerd, vercel-edge, react-native
|
|
94
|
+
moduleFormat = "esm" // esm 또는 cjs
|
|
95
|
+
previewFeatures = ["queryCompiler", "driverAdapters"]
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 핵심 개념
|
|
100
|
+
|
|
101
|
+
### Prisma Client 설정
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// lib/prisma.ts
|
|
105
|
+
import { PrismaClient } from './generated/prisma'
|
|
106
|
+
|
|
107
|
+
const globalForPrisma = globalThis as unknown as {
|
|
108
|
+
prisma: PrismaClient | undefined
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export const prisma =
|
|
112
|
+
globalForPrisma.prisma ??
|
|
113
|
+
new PrismaClient({
|
|
114
|
+
log: ['query'],
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 기본 쿼리
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
// 조회
|
|
124
|
+
const users = await prisma.user.findMany()
|
|
125
|
+
|
|
126
|
+
// 생성
|
|
127
|
+
const user = await prisma.user.create({
|
|
128
|
+
data: { email: 'alice@prisma.io', name: 'Alice' },
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
// 수정
|
|
132
|
+
const updated = await prisma.user.update({
|
|
133
|
+
where: { id: 1 },
|
|
134
|
+
data: { name: 'Updated Name' },
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
// 삭제
|
|
138
|
+
const deleted = await prisma.user.delete({
|
|
139
|
+
where: { id: 1 },
|
|
140
|
+
})
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 마이그레이션 명령어
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# 개발 환경 마이그레이션
|
|
147
|
+
npx prisma migrate dev --name init
|
|
148
|
+
|
|
149
|
+
# 프로덕션 마이그레이션
|
|
150
|
+
npx prisma migrate deploy
|
|
151
|
+
|
|
152
|
+
# 스키마 동기화 (개발용)
|
|
153
|
+
npx prisma db push
|
|
154
|
+
|
|
155
|
+
# Prisma Client 생성
|
|
156
|
+
npx prisma generate
|
|
157
|
+
|
|
158
|
+
# Prisma Studio (GUI)
|
|
159
|
+
npx prisma studio
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## 참고 자료
|
|
163
|
+
|
|
164
|
+
- [Prisma 공식 문서](https://www.prisma.io/docs)
|
|
165
|
+
- [Prisma GitHub](https://github.com/prisma/prisma)
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Prisma - 관계 쿼리
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [Prisma](./index.md)
|
|
4
|
+
|
|
5
|
+
## 중첩 생성 (Nested Create)
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
const result = await prisma.user.create({
|
|
9
|
+
data: {
|
|
10
|
+
email: 'elsa@prisma.io',
|
|
11
|
+
name: 'Elsa Prisma',
|
|
12
|
+
posts: {
|
|
13
|
+
create: [
|
|
14
|
+
{ title: 'How to make an omelette' },
|
|
15
|
+
{ title: 'How to eat an omelette' },
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
include: {
|
|
20
|
+
posts: true,
|
|
21
|
+
},
|
|
22
|
+
})
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 관계 연결
|
|
26
|
+
|
|
27
|
+
### connect - 기존 레코드 연결
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
const post = await prisma.post.create({
|
|
31
|
+
data: {
|
|
32
|
+
title: 'New Post',
|
|
33
|
+
author: {
|
|
34
|
+
connect: { id: 1 },
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### connectOrCreate - 있으면 연결, 없으면 생성
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
const post = await prisma.post.create({
|
|
44
|
+
data: {
|
|
45
|
+
title: 'New Post',
|
|
46
|
+
categories: {
|
|
47
|
+
connectOrCreate: {
|
|
48
|
+
where: { name: 'Technology' },
|
|
49
|
+
create: { name: 'Technology' },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### disconnect - 관계 해제
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
const post = await prisma.post.update({
|
|
60
|
+
where: { id: 1 },
|
|
61
|
+
data: {
|
|
62
|
+
author: {
|
|
63
|
+
disconnect: true,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
})
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 관계 포함 조회
|
|
70
|
+
|
|
71
|
+
### include 사용
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
const users = await prisma.user.findMany({
|
|
75
|
+
include: {
|
|
76
|
+
posts: true,
|
|
77
|
+
profile: true,
|
|
78
|
+
},
|
|
79
|
+
})
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 중첩 include
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
const users = await prisma.user.findMany({
|
|
86
|
+
include: {
|
|
87
|
+
posts: {
|
|
88
|
+
include: {
|
|
89
|
+
categories: true,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
})
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 관계 필터링
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
const users = await prisma.user.findMany({
|
|
100
|
+
include: {
|
|
101
|
+
posts: {
|
|
102
|
+
where: { published: true },
|
|
103
|
+
orderBy: { createdAt: 'desc' },
|
|
104
|
+
take: 5,
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
})
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 관계로 필터링
|
|
111
|
+
|
|
112
|
+
### some - 하나라도 조건 만족
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
const users = await prisma.user.findMany({
|
|
116
|
+
where: {
|
|
117
|
+
posts: {
|
|
118
|
+
some: { published: true },
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
})
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### every - 모두 조건 만족
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
const users = await prisma.user.findMany({
|
|
128
|
+
where: {
|
|
129
|
+
posts: {
|
|
130
|
+
every: { published: true },
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
})
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### none - 조건 만족 없음
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
const users = await prisma.user.findMany({
|
|
140
|
+
where: {
|
|
141
|
+
posts: {
|
|
142
|
+
none: { published: false },
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
})
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## 관계 카운트
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
const users = await prisma.user.findMany({
|
|
152
|
+
include: {
|
|
153
|
+
_count: {
|
|
154
|
+
select: { posts: true },
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
// 결과: { id: 1, name: 'Alice', _count: { posts: 5 } }
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## 중첩 업데이트
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
const user = await prisma.user.update({
|
|
166
|
+
where: { id: 1 },
|
|
167
|
+
data: {
|
|
168
|
+
posts: {
|
|
169
|
+
updateMany: {
|
|
170
|
+
where: { published: false },
|
|
171
|
+
data: { published: true },
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
})
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 중첩 삭제
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
const user = await prisma.user.update({
|
|
182
|
+
where: { id: 1 },
|
|
183
|
+
data: {
|
|
184
|
+
posts: {
|
|
185
|
+
deleteMany: {
|
|
186
|
+
where: { published: false },
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
})
|
|
191
|
+
```
|