Flutter Firebase Как Выполнить Динамический Запрос

# #firebase #flutter #google-cloud-firestore

Вопрос:

У меня есть такой запрос;

 final _firestore = FirebaseFirestore.instance;

var sRef = _firestore
          .collection("vehicles")
          .where("models.car", isEqualTo: "true")
          .where("models.plane", isEqualTo: "true")
          .where("models.motor", isEqualTo: "true");
 

С помощью этого запроса я могу запросить,какой список включает автомобиль, самолет и двигатель одновременно. Но я хочу сделать запрос динамично. Поэтому я сделал это для loop;

 List<String> item = ["car", "motor", "plane"];

   var sRef;
    
   for (int i = 0; i < item.length; i  ) {
          
            sRef = _firestore
                          .collection("vehicles").where("models.${item[i]}", isEqualTo: "true");
                          
        }
 

Но все вышло не так, как я ожидал.

Когда я хочу использовать цикл for для отображения списков, содержащих элементы в списке элементов, код дополнительно показывает мне списки, содержащие последний элемент в списке элементов.

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

И после того, как я попробовал это для цикла;

 for (int i = 0; i < item.length; i  ) {
  if (sRef == null) {
    sRef = _firestore.collection("vehicles").where("models.${item[i]}", isEqualTo: "true");  
  } else {
    sRef.where("models.${item[i]}", isEqualTo: "true");  
  }  
}
 

Но на этот раз этот код цикла for дополнительно показывает мне списки, содержащие первый элемент в списке элементов.

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

Почему я получаю список с именем САМОЛЕТ со списком с именем ВСЕ, когда я использую первый цикл, или почему я получаю список с именем АВТОМОБИЛЬ со списком с именем ВСЕ, когда я использую второй цикл для. Я просто хочу получить список ВСЕХ названных.

В отличие от 2 методов, должен быть способ каким-то образом сделать этот запрос динамичным. Флаттер не может быть таким неполным языком, я искал во многих местах, я пробовал много решений, но я не мог найти решение для этого, действительно ли в мире есть способ сделать это.

Это мои документы Firebase для лучшего понимания моей базы данных;

Документ со списком Автомобилей

Документ списка самолетов

Документ со списком двигателей

Весь список Документов

Комментарии:

1. Попробуй "models.${item[i]}" . Теперь вывод должен быть models.car и так далее. Пример на DartPad

Ответ №1:

В ответе на ваш предыдущий вопрос есть небольшая ошибка. Чтобы добавить условия в завершающий запрос, используйте:

 for (int i = 0; i < item.length; i  ) {
  if (sRef == null) {
    sRef = _firestore.collection("vehicles").where("models.${item[i]}", isEqualTo: "true");  
  } else {
    sRef = sRef.where("models.${item[i]}", isEqualTo: "true");  
    // 👆 this is new
  }  
}
 

На самом деле я предпочитаю эту версию ниже себя, так как она выводит if условие из цикла:

 sRef = _firestore.collection("vehicles");
for (int i = 0; i < item.length; i  ) {
  sRef = sRef.where("models.${item[i]}", isEqualTo: "true");  
}
 

Результат между двумя фрагментами одинаков, я просто нахожу, что вторую версию легче поддерживать.

Комментарии:

1. Большое вам спасибо, я занимаюсь этой проблемой уже около месяца.