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.
3 odpowiedzi
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 ...
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
}
}
}
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.
Podobne pytania
Nowe pytania
reactjs
React to biblioteka JavaScript do tworzenia interfejsów użytkownika. Wykorzystuje deklaratywny paradygmat oparty na komponentach i ma być zarówno wydajny, jak i elastyczny.