🦔

T3stackで難しいかった多対多関係

2024/07/09に公開

prisma「多対多 (Many-to-Many) 関係」

USERもDEPARTMENTが複数必要で、DEPARTMENTもUSERが複数必要

  1. テーブル定義
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")
}
  1. 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