👀 See Sanity in action: Watch product demo now →

How to Concatenate String Fields in a Schema

9 replies
Last updated: Mar 19, 2021
Is it possible to define a string field in a schema that is automatically filled with other strings in the same schema concatenated together? E.g. if I have fields for firstName, middleName and lastName, and I want the field fullName to be automatically set to a concatenated version of the three other strings.
Mar 19, 2021, 12:15 PM
Hi!I think it doesn't make a lot sense to have an editable field for "Full Name"
You can show the full name in the list preview.
Or a bit harder: you can code a custom input component that displays the full name direclty in the editor.

And don't worry about querying the data, you can easily form the full name directly inside the GROQ query, no need to build that value on the front-end.
Mar 19, 2021, 12:26 PM
No, I didn't mean that the Full Name field should be editable. Actually I wanted it to be read only. I just wanted the full name available in the dataset when reading it in my application, so I don't have to concatenate it every time I want to use it. But can it be formed in the GROQ fetch query you say?
Mar 19, 2021, 12:30 PM
Here's my current GROQ query:
  useEffect(() => {
    sanityClient
      .fetch(`*[_type == "employee"]{
        name,
        slug,
        jobTitle,
        emailAddress,
        mobilePhoneNumber,
        photo{
          asset->{
            _id,
            url
          }, 
          alt,
          hotspot
        }
      }`)
      .then((data) => {
        const sortedData = data.sort((a,b) => {
          return a.name.firstName.localeCompare(b.name.firstName, 'nb');
        });
        setEmployeeList(sortedData);
      }, [])
      .catch(console.error);
  }, []);
Mar 19, 2021, 12:31 PM
You can do a document action if you need. But I don't think that would be available on a draft.
Mar 19, 2021, 12:47 PM
*[_type == "employee"]{
        "name": firstname + ' ' + middlename + ' ' + lastname,
        slug,
        jobTitle,
        emailAddress,
        mobilePhoneNumber,
        photo{
          asset->{
            _id,
            url
          }, 
          alt,
          hotspot
        }
      }
But it's true that middle name can be empty. in that case I'm not 100% how the string would look
Mar 19, 2021, 1:06 PM
I agree, it would be nice to do it in the GROQ to avoid duplicated data. I'm looking into middleName not being defined right now.
Mar 19, 2021, 1:07 PM
there's a
coalesce
function, but then the query gets complicated
Mar 19, 2021, 1:08 PM
Ah, good catch on
coalesce
. Made it easy to check on a null value (i.e. middleName not being added). This GROQ works well:
    sanityClient
      .fetch(`*[_type == "employee"] | order(name.firstName){
        name{
          firstName,
          middleName,
          lastName,
          "fullName": firstName + " " + coalesce(middleName + " ", "") + lastName
        },
        slug,
        jobTitle,
        emailAddress,
        mobilePhoneNumber,
        photo{
          asset->{
            _id,
            url
          }, 
          alt,
          hotspot
        },
      }`)

Mar 19, 2021, 1:13 PM

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.