👀 See Sanity in action: Watch product demo now →

What is the best way to validate that e.g. a title for a document is unique within its type?

5 replies
Last updated: Sep 21, 2020
Hi,What is the best way to validate that e.g. a title for a document is unique within its type?
Is it to make a custom inputComponent for the fields and make a client groq check before updating the value, or is there a smarter, simpler way?
Sep 21, 2020, 8:46 AM
Hi Louise, I think there’s no easy function available for this, unfortunately (unlike e.g.
slug
type fields that have an
isUnique()
option). However, I don’t think you’d have to create a custom input component to achieve it. Instead, you could use an async operation to check inside the validation function itself: https://www.sanity.io/docs/validation#custom-validation-091e10f957aa
Sep 21, 2020, 9:19 AM
Ok thanks
user M
- I have been looking at the examples previously. How do I validate against other documents though? I do not think they are available in the context parameter. Should I have a reference to a client and do a groq lookup?
Sep 21, 2020, 9:24 AM
Indeed, I would import the pre-configured client and check for existing docs with the title:
import client from 'part:@sanity/base/client'
. There might be an alternative way but it’s Monday and I can’t come up with it if so 😉 Will update if I think of something but in my mind this approach is the most straightforward.
Sep 21, 2020, 9:32 AM
Ok great, thanks.An example for others that might find this thread:

import client from 'part:@sanity/base/client'
...
{
      name: 'title',
      title: 'Title',
      type: 'string',
      validation: Rule => Rule.required().custom((title) => {
        return client.fetch(`count(*[_type == "category" && title == "${title}"])`)
        .then(count => {
          if (count > 1){
            return 'Title needs to be unique'
          }else{
            return true
          }
        })
      })
    },
Sep 21, 2020, 9:45 AM
Thanks for sharing the outcome! 🙌
Sep 21, 2020, 9:46 AM

Sanity.io – build remarkable experiences at scale

Sanity is a customizable solution that treats content as data to power your digital business. Free to get started, and pay-as-you-go on all plans.

Categorized in