🦔
T3stackで難しいかった多対多関係
prisma「多対多 (Many-to-Many) 関係」
USERもDEPARTMENTが複数必要で、DEPARTMENTもUSERが複数必要
- テーブル定義
model User {
id String @id @default(cuid())
userDepartment Department[] @relation("userDepartment")
@@map("USER")
}
model Department {
id String @id @default(cuid())
userDepartment InformationAsset[] @relation("userDepartment")
@@map("DEPARTMENT")
}
- migration実行
npx prisma migrate dev --name init;
を実行したら「1対1 (One-to-One) 関係」、「1対多 (One-to-Many) 関係」とは違って中間テーブルが生成される。
getを使う時はいつもの通り使かうことができたが、
getOne: publicProcedure
.input(z.object({
id: z.string(),
}))
.query(({ ctx, input }) => {
return ctx.db.department.findUnique({
where: {
id: input.id
},
include: {
userDepartment: true,
}
});
}),
create, updateの場合は
updateDepartment: publicProcedure
.input(z.object({
userId: z.string(),
departmentIds: z.array(z.string()),
}))
.mutation(async ({ ctx, input }) => {
await ctx.db.user.update({
where: {
id: input.userId,
},
data: {
userDepartment: {
set: [],
},
},
});
const updatedAsset = await ctx.db.user.update({
where: {
id: input.userId,
},
data: {
userDepartment: {
connect: input.departmentIds.map((departmentId) => ({ id: departmentId })),
},
},
include: {
userDepartment: true,
},
});
return updatedAsset;
}),
のよう書かなければならない。。後でもっと簡単な方法を見つかったら追加する。
Discussion