如何在 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
}
}
}
我正在使用 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)
}
您可以在后端检查您的参数。并创建一个灵活的对象来查询...
我建议使用 undefined
。
正如 prisma 官方文档 here 中提到的,您可以使用 undefined
选择性地从查询中排除一个字段。
例如,
where: {
model : {
brand: {
id: $brandId != null ? $brandId : undefined
}
}
}