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

Posted

技术标签:

【中文标题】如何在 Prisma 中指定可选的查询过滤器?【英文标题】:How can I specify optional query filters in Prisma? 【发布时间】:2020-07-07 01:17:29 【问题描述】:

我正在使用 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  
    ) 
    ...
    

我调查了一个并发现了一个可能的solution,但帖子所指的自定义输入并未在我的 prisma 中生成。

【问题讨论】:

您是否尝试过设置显示全部的默认查询。那么第一次进入页面时,有没有选择默认的选择,如果有,是什么? 是的,@Leafyshark 有一个 select,它选择了默认值 all 哦,我明白了,那你能不能不写一些查询所有汽车并返回它们的中间件? 【参考方案1】:
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)

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

【讨论】:

【参考方案2】:
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”之类的,然后会查询所有品牌。

【讨论】:

我认为这个解决方案行不通。 Prisma 将查询所有型号为“exampleBrandId”的汽车,该值将为 0,因为没有汽车的 id 为“exampleBrandId” @Xalsar 解决方案是使“exampleBrandId”成为变量,因此是动态的。然后你可以选择一个选项列表,例如:“Lamborghini”“Ferrari”“Porsche”,最后是“All”,它会返回所有......这行得通吗?为了公平起见,我正在考虑 Prisma / Next / Apollo 的背景!【参考方案3】:

answer from @Toiz 是可行的。但是,如果参数数量增加,需要多个 if 语句怎么办?

我建议使用undefined

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

例如,

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

【讨论】:

以上是关于如何在 Prisma 中指定可选的查询过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

在 pypi python setup.py 中指定可选依赖项

按可选的开始和结束日期过滤查询集

Drupal 视图和公开的过滤器 - 如何重置可选的下拉列表过滤器,或允许“全部”选择

Spring Data JPA:如何使用可选的过滤器参数?

如何在我的 schema.graphql 文件中为按 id 过滤的查询引用生成的 Prisma 模式

在过滤器中处理可选的 JWT 身份验证是个好主意吗?