typescript - Jag behöver en förfrågan som denna i graphql men jag kan inte lista ut hur man gör det


Jag håller på att göra en biluthyrningsapplikation för att förbättra mig själv. .../fordon adresslistor fordon, jag har 5 valbara inmatningar på vänstra sidofältet. Om ett värde är valt vill jag att det ska ha ett filter, om det inte är valt vill jag att det inte ska ha något filter. Jag kunde inte strukturera hur jag skulle skicka frågan och datan. Kan du hjälpa mig?

subscription Vehicles($daily_price: String) {
      vehicles(where: { _or: { daily_price: $daily_price, fuel: {}, gear: {}, model_id: {}, brand_id: {} } }) {
  id
  fuel
}
const { data, loading, error } = useSubscription(from && to ? VEHICLES_BY_DATE_RANGE : VEH_SUBS, {
      variables: {
         ...filters,
      },
   });

Svar #1

Okej, här är en skiss på hur man arbetar med variabler. Typdeklarationen är bara baserad på vad jag antar är korrekt baserat på dina kodexempel, så du kan behöva justera dem.

// I'm skipping the definition of how the Where filters, so here's just the query:
const VEH_SUBS = gql`
  subscription getVehicles($where: Where!) {
    vehicles(where: $where) {
      model {
        name
      }
    }
  }`;

// I'm assuming the type of the filters based on your code snippets. They could be wrong (e.g. brand_id could be a number).
const createQuery = (filters: { brand_id?: string, fuel?: string, }) => {
  // I'm assuming the type of the filterConditions based on your code snippets. It's probably not complete. 
  const filterConditions: {
    where: { _or: { brand_id?: { _eq?: string }, fuel?: { _eq?: string } } }
  } = { where: { _or: {} } };

  // Setup filterConditions. Ofc, this could be done direclty in the line above, but I keep it separate so it might be easier to follow.
  if (filters?.brand_id) filterConditions.where._or.brand_id = { _eq: filters.brand_id };
  if (filters?.fuel) filterConditions.where._or.fuel = { _eq: filters.fuel };

  const { data: d, loading: l, error: e } = useSubscription(
    VEH_SUBS, // This should be a query which accepts where as argument!
    { variables: {where: filterConditions }}
  );
  ...
};

Igen, jag skulle rekommendera dig att använda graphql-codegen istället för uttrycklig typantagning som jag gjorde, och också istället för any som du gjorde.

Svar #2

Jag vet att jag inte förklarade mitt problem ordentligt. Jag löste det så här, kanske du kan förstå genom att titta på det:

const createQuery = (filters: any) => {
      const filterConditions = [];

      if (filters?.brand_id) filterConditions.push(`brand_id : {_eq: "${filters.brand_id}"}`);
      if (filters?.fuel) filterConditions.push(`fuel: {_eq: "${filters.fuel}"}`);
      let q;
      if (filterConditions.length > 0) {
         q = `
            {
               _or: {${filterConditions.join(", ")}}
            }
         `;
      } else q = "{}";

      return gql`
            subscription getVehicles {
               vehicles(where: ${q}) {
                  model {
                     name
                  }
               }
            }
         `;
   };

   const q = createQuery(filters);

   const { data: d, loading: l, error: e } = useSubscription(q);

Jag tackar verkligen för ditt intresse, men jag skulle uppskatta om du kunde förstå problemet och förklara en annan lösning.