# #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. Большое вам спасибо, я занимаюсь этой проблемой уже около месяца.