如何在 Prisma 中指定可选的查询过滤器?

How can I specify optional query filters in Prisma?

我正在使用 React、Apollo 和 Prsima 构建一个应用程序,允许用户按型号、品牌、价格过滤汽车...我知道(例如)如何按品牌过滤汽车:

const GET_CARS = gql`
  query FilterCars($brandId: ID){
    cars(where: {   
        model : { brand: { id: $brandId } }
    }) {
        id
        model {
            name
            brand {
             name
            }
            horses
        }
        year
        km
        price
        ...
  }
`;

并且在组件中:

const CarList = (props) => {
    const { data, loading, error } = useQuery(GET_CARS, {
        variables: {
            brandId: "exampleBrandId"
        }
    })

    ...
}

问题是,有些参数是可选的:也许用户不关心品牌,或者型号,或者价格......所以所有的车都应该出现:如果没有选择品牌,汽车的所有品牌都应该出现;如果没有选择价格,应该出现所有价格的车...

我该怎么做?类似于:

query FilterCars($brandId: ID){
    cars(where: {   
        model : { brand: { id: $brandId || all_brand_ids } }
    }) {
    ...
    }
}

我调查了 a 并找到了一个可能的 solution,但是 post 所指的自定义输入并未在我的 prisma 中生成。

const GET_CARS = gql`
  query FilterCars($brandId: ID){
    cars(where: {   
        model : { brand: { id: $brandId } }
    }) {
        id
        model {
            name
            brand {
             name
            }
            horses
        }
        year
        km
        price
  }
`;

const CarList = (props) => {
    const { data, loading, error } = useQuery(GET_CARS, {
        variables: {
            brandId: "exampleBrandId"
        }
    })
}

brandId: "exampleBrandId" - 这应该是动态的,其中一个选项可能类似于 "All Brands",然后它将查询所有品牌。

getCars(parent, args, {prisma}, info){
  const queryArgs ={}
  if(args.brandId){
     queryArgs ={
       where: {
         model: {
          id: args.brandId
       }
      }
    }
  }

 if(args.price){
    queryArgs={
      ...queryArgs,
      where: {
      ...queryArgs.where
      //What every you want to add
      }
    }
 }

  return prisma.query.cars(queryArgs, info)
}

您可以在后端检查您的参数。并创建一个灵活的对象来查询...

是可行的。但是,如果参数个数增加到需要多个if-statements怎么办?

我建议使用 undefined

正如 prisma 官方文档 here 中提到的,您可以使用 undefined 选择性地从查询中排除一个字段。

例如,

where: {   
  model : { 
    brand: { 
      id: $brandId != null ? $brandId : undefined
    } 
  }
}