如何在 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 视图和公开的过滤器 - 如何重置可选的下拉列表过滤器,或允许“全部”选择