Мне нужен такой запрос в графе, но я не могу понять, как это сделать

Я делаю приложение по аренде автомобилей, чтобы улучшить себя. .../перечисляет адреса транспортных средств, у меня есть 5 входов для выбора на левой боковой панели. Если значение выбрано, я хочу, чтобы у него был фильтр, если оно не выбрано, я хочу, чтобы у него не было фильтра. Я не мог структурировать, как отправить запрос и данные. Вы можете помочь мне?

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,
      },
   });

Привет! Во-первых, почему subscription вместо обычного query? Во-вторых, вам может понадобиться генерировать правильные типизированные запросы с помощью graphql-codegen . В-третьих, не совсем понятно, в чем на самом деле заключается ваша проблема. Как использовать useSubscription? В-четвертых, мне кажется, что вы хотите фильтровать по дате, но ваш фильтр where этого не охватывает - только daily_price и т. д. В-пятых, как на самом деле выглядит filters? Или это тоже зависит от from && to? В-шестых, как выглядит VEHICLES_BY_DATE_RANGE? - Ты только показал другой.

NotX 11.08.2024 00:25

Также не то, чтобы вы могли передать skip: true в качестве опции — поэтому может иметь смысл использовать разные перехватчики для каждого запроса и переменных, но передайте что-то вроде skip: from && to соответственно. skip: !(from && to) чтобы обеспечить вызов только нужного.

NotX 11.08.2024 00:27

Извините, подписка, потому что бронирование можно сделать мгновенно, а наличие транспортных средств может быть изменено. И VEHICLES_BY_DATE_RANGE не имеет значения, потому что я сейчас не использую, но просто забыл об этом. Моя проблема заключается в создании запросов, которые иногда могут быть пустыми, а иногда и полными, например, кто-то может захотеть отфильтровать ценовой диапазон автомобиля, а кто-то - нет. Как мне с этим справиться?

Enes SEVAL 11.08.2024 03:29

Мне до сих пор трудно понять, в чем ваша проблема. Если вы хотите отфильтровать, скажем, цену, передайте when: { daily_price: "50"} в переменные. Если вы не хотите фильтровать, не передавайте переменные. Так в чем именно проблема?

NotX 11.08.2024 16:15

Теперь, например, чтобы выполнить запрос, мне нужно определить такой запрос, как подписка Vehicle($daily_price:String){vehilces(where: _or:{daily_price:$daily_price})}{id}, но когда я отправляю запрос типа const {данные, загрузка, ошибка} = useSubscription(VEH_SUBS, {переменные: {}, }); или если я отправлю daily_price как пустой объект или пустую строку типа «» в переменных, это не сработает.

Enes SEVAL 11.08.2024 16:46

Что вы имеете в виду под «это не работает»? Ошибка? Неправильные результаты? Глядя на ваши фрагменты, я даже не знаю, является ли where обязательным параметром или where._or. Согласно вашему объявлению, daily_price не является обязательным (поскольку это String, а не String!, но для всего остального я не могу сказать. Обязательные объекты должны передаваться, конечно, например, с variables: { where: { _or: {}}}, но на самом деле это просто догадки без схемы .

NotX 11.08.2024 16:54

Не знаю, возможна ли разметка, ниже написал как решил.

Enes SEVAL 11.08.2024 17:37
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
2
7
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я знаю, что неправильно объяснил свою проблему. Я решил это так, возможно, вы сможете понять, посмотрев на это:

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);

Я очень благодарен вам за ваш интерес, но был бы признателен, если бы вы поняли проблему и объяснили другое решение.

Ответ принят как подходящий

Хорошо, вот набросок того, как работать с переменными. Объявление типа основано только на том, что я считаю правильным на основе ваших фрагментов кода, поэтому вам, возможно, придется их настроить.

// 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 }}
  );
  ...
};

Опять же, я рекомендую вам использовать graphql-codegen вместо явного предположения типа, как я, а также вместо any, как вы.

Я точно не знаю, что такое кодеген, но я посмотрю на него. Еще раз большое спасибо за ваш интерес.

Enes SEVAL 11.08.2024 20:32

@EnesSEVAL Всегда пожалуйста!

NotX 11.08.2024 21:40

Другие вопросы по теме