👀 Our most exciting product launch yet 🚀 Join us May 8th for Sanity Connect

Filtering Reference Based on Selected Product

2 replies
Last updated: Jan 10, 2023
Hi!I got an array products and within those products there are an array of variants.

I need to filter reference based on the selected product. Since I need to be able to choose several variants per product I cant seem to find a way to get the selected product.

Anyone know a solution to this?
Jan 6, 2023, 2:36 PM
Here is the product part of the schema.
defineField({

name: 'products',

title: 'Products',

type: 'array',

group: 'content',

of: [

defineArrayMember({

name: 'productWithSelectedVariants',

title: 'Product with selected variants',

type: 'object',

fields: [

defineField({

name: 'product',

title: 'Product',

type: 'reference',

to: [{ type: 'product' }],

weak: true,

}),

defineField({

name: 'variants',

title: 'Variants',

type: 'array',

of: [

defineArrayMember({

name: 'variant',

title: 'Variant',

type: 'reference',

weak: true,

to: [{ type: 'productVariant', }],

options: {

filter: ({ parent, document }) => {

console.log('parent', parent);

console.log('document', document);


return {
`filter:
_type == "productVariant"
,`
params: {

shopifyProductId: null,

},

}

},

}

}),

]

}),

],

}),

],

})
Jan 6, 2023, 2:39 PM
This is tricky because you need to find the product within the document using the parent (which is an array of variants). Something like this should work if you’re using references to indicate the parent product:
defineField({
      name: 'products',
      title: 'Products',
      type: 'array',
      of: [
        defineArrayMember({
          name: 'productWithSelectedVariants',
          title: 'Product with selected variants',
          type: 'object',
          fields: [
            defineField({
              name: 'product',
              title: 'Product',
              type: 'reference',
              to: [{type: 'product'}],
              weak: true,
            }),
            defineField({
              name: 'variants',
              title: 'Variants',
              type: 'array',
              of: [
                defineArrayMember({
                  name: 'variant',
                  title: 'Variant',
                  type: 'reference',
                  weak: true,
                  to: [{type: 'productVariant'}],
                  options: {
                    filter: ({parent, document}) => {
                      const productID = document.products.find(
                        (product) => product.variants == parent
                      ).product._ref

                      return {
                        filter: `_type == "productVariant" && references($productID)`,
                        params: {
                          shopifyProductId: null,
                          productID,
                        },
                      }
                    },
                  },
                }),
              ],
            }),
          ],
        }),
      ],
    }),
Jan 10, 2023, 7:33 PM

Sanity– build remarkable experiences at scale

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

Was this answer helpful?