Buduję aplikację z React, Apollo i Prsima, która pozwala użytkownikom filtrować samochody według modelu, marki, ceny ... Wiem (na przykład), jak filtrować samochody według marki:

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

A w komponencie:

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

    ...
}

Problem w tym, że niektóre parametry są opcjonalne: może użytkownik nie dba o markę, model, czy cenę ... Więc wtedy powinny pojawić się wszystkie samochody: Jeśli nie zostanie wybrana żadna marka, powinny pojawić się samochody wszystkich marek; Jeśli nie wybrano żadnej ceny, powinny pojawić się samochody wszystkich cen ...

Jak mogę to zrobić? Coś jak:

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

Zbadałem i znalazłem możliwe rozwiązanie, ale niestandardowe dane wejściowe, do których odnosi się post, nie są generowane w mojej pryzmacie.

2
Xalsar 26 marzec 2020, 14:56

3 odpowiedzi

Najlepsza odpowiedź
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)
}

Możesz sprawdzić na zapleczu swoje argumenty. I utwórz elastyczny obiekt do zapytania o ...

3
Tölz 29 marzec 2020, 09:34

Odpowiedź z @Toiz jest możliwa. Jednak co się stanie, jeśli liczba parametrów wzrośnie, tak że potrzeba będzie wielu instrukcji if?

Sugeruję użycie undefined.

Jak wspomniano w oficjalnych dokumentach prisma tutaj, możesz użyć undefined, aby opcjonalnie wykluczyć pole z zapytania.

Na przykład,

where: {   
  model : { 
    brand: { 
      id: $brandId != null ? $brandId : undefined
    } 
  }
}
0
zzinny 21 październik 2020, 05:17
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” - to powinno być dynamiczne, a jedną z opcji może być coś w rodzaju „Wszystkie marki”, które będą następnie wyszukiwać wszystkie marki.

2
Leafyshark 28 marzec 2020, 17:12