Search code examples
javascriptnext.jscrudprisma

How can I UPDATE fields separately with Prisma?


I have an object called Post with fields that I need to be able to UPDATE separately. For example, the object will have three fields: title content summary.

Use case

I can create a post object and save it in my DB by filling in the field title, and the other fields with empty strings. The idea is to be able to go to the individual post page via it's id, and then update the other fields as and when i need to.

On my page I have this code to update the title only:

    const updateTitleData = async () => {
            try {
                await fetch(`/api/story/${id}`, {
                    method: 'PUT',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify(title)
                })
                refreshData()
            } catch (error) {
                toast.error('Document could not be updated')
                console.error(error);
            }
        };

In my API route, I have the following:

    const storyId = req.query.id
    const {title, content, summary} = req.body
     else if (req.method !== 'PUT') {
            console.log("Note could not be modified")
            res.status(400).json({message: "Note could not be modified"})
        } else {
           await prisma.story.update({
                where: {id: storyId},
                data: {
                    title,
                    content,
                    summary
                }
            })
            res.status(200).json({message: ' updated'})
        }

I can't get this to work, no mutation happens when I have it this way, i.e

const {title, content, summary} = req.body

But when I have it this way

const title = req.body
const content = req.body
const summary = req.body

If I update just one of these, I get a mutation, but it updates all the 3 fields with the same value.

How can I just update one field at a time?


Solution

  • Assuming that title is a string. If you are passing

    body: JSON.stringify(title)
    

    in the API then req.body will be a string. And when you are doing

    const title = req.body
    const content = req.body
    const summary = req.body
    

    then this string will be stored in all three variables. And you thus all three attributes of the post will be updated with the same value.

    Typically you would pass something like:

    body: {
      title: "new title"
    }
    

    in the API.

    Then the body would be that object. And if you do

    const {title, content, summary} = req.body
    

    title will be the string new title, content and summary will be undefined.

    You can then use these values to update your database accordingly.