How to update an entity using it's foreign key in Prisma?

Issue

I have a simple API where authenticated users are allowed to perform CRUD operations on videos. The Video model holds a foreign key called creatorId, which references the User model that created it. I’m trying to update the video by passing the creatorId into the where clause of the Prisma function, however I am getting the following error:

Unknown arg `creatorId` in where.creatorId for type VideoWhereUniqueInput. Available args:

type VideoWhereUniqueInput {
  id?: Int
}

Here is my attempt using Express JS.

export const updateVideo = async (req, res, next) => {

    const userId = parseInt(req.user.id)
    const videoId = parseInt(req.params.id)

    try {

        // check if video exists or not
        const videoToUpdate = await prisma.video.findUnique({
            where: {
                id: videoId
            }
        })

        // if no video was found throw an error
        if (!videoToUpdate)
            return next(createError(404, `Video with ID ${req.params.id} does not exist`))

        // update the video
        const updatedVideo = await prisma.video.update({

            // find video that was created by the user
            where: {
                creatorId: userId
            },

            // data to change
            data: {
                ...req.body,
            }
        })

        res.status(200).json(updatedVideo)
    } 

    catch (error) {
        console.log(error)
        next(error)
    }
}

And here are my Prisma models:

model User {
  id Int @id @default(autoincrement())
  email String @unique 
  name String
  password String
  img String?
  subscriberCount Int? @default(0)
  videos Video[]
  comments Comment[]
  followedBy Follows[] @relation("following")
  following Follows[] @relation("follower")
  likedVideos Likes[]
}

model Video {
  id Int @id @default(autoincrement())
  creator User @relation(fields: [creatorId], references: [id])
  creatorId Int 
  title String 
  description String 
  videoUrl String?
  views Int? @default(0)
  tag String? @default("Uncategorized")
  likedBy Likes[]
  comments Comment[]
}

How can I fix this such that Prisma can do the update query based on the Foreign key? I’m aware there are ways around this issue that don’t involve using the Foreign key like this, but I’m just curious as to why my naive solution doesn’t work. For example, why would a similar approach work with a primary key but not a foreign one?

Solution

Add the @unique attribute to the creatorId field. Prisma only allows unique fields to be specified in where clauses.

Answered By – Austin Crim

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published