Home > front end >  Prisma: how to write transaction where results from one query are used by another query
Prisma: how to write transaction where results from one query are used by another query

Time:10-04

I'm working on a project with Next.js and Prisma. In one of my API routes, I have a three queries. The results of the first and second queries are used in the third query. I'd like to do all three operations as a transaction. I'm familiar with using prisma.$transaction but I don't know how to write it in this case where results #1 and #2 are used by query #3. Here are the queries as they are written now. Thanks in advance!

const { boardId } = req.body
const { description, status, title } = req.body.task

const createTask = await prisma.task.create({
  data: {
    board: boardId,
    description,
    status,
    title
  }
})

const statusArray = await prisma.board.findUnique({
  where: {
    id: boardId
  },
  select: {
    [status]: true
  }
})

const updateBoardStatusArray = await prisma.board.update({
  where: {
    id: boardId
  },
  data: {
    [status]: {
      set: [...statusArray[status], createTask.id]
    }
  }
})

CodePudding user response:

Here you go:

  const { boardId } = req.body;
  const { description, status, title } = req.body.task;

  const updateBoardStatusArray = await prisma.$transaction(async (prisma) => {
    const createTask = await prisma.task.create({
      data: {
        board: boardId,
        description,
        status,
        title,
      },
    });

    const statusArray = await prisma.board.findUnique({
      where: {
        id: boardId,
      },
      select: {
        [status]: true,
      },
    });

    return prisma.board.update({
      where: {
        id: boardId,
      },
      data: {
        [status]: {
          set: [...statusArray[status], createTask.id],
        },
      },
    });
  });

You can learn more about Interactive Transaction here

  • Related