【问题标题】:Flutter Firebase How To Do Dynamic QueryFlutter Firebase 如何做动态查询
【发布时间】:2021-07-28 12:00:36
【问题描述】:

我有这样的查询;

final _firestore = FirebaseFirestore.instance;

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

通过这个查询,我可以同时查询哪个列表包括汽车、飞机和电机。但我想动态查询。因此我做了这个 for 循环;

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 循环之后;

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 循环代码还向我显示了包含项目列表中第一个元素的列表。

例如,在此示例中,它向我显示了包含汽车、汽车和飞机的列表,它还显示了仅包含汽车的列表,但我不想仅显示包含汽车的列表,我只是想要显示包含汽车、马达、飞机的列表。

为什么我在使用第一个循环时得到名为 PLANE 的列表和名为 ALL 的列表,或者为什么在使用第二个 for 循环时得到名为 CAR 的列表和名为 ALL 的列表。我只想列出名为 ALL 的列表。

与这 2 种方法不同,必须有一种方法可以使该查询以某种方式动态化。 Flutter不可能是这么不完整的语言,我找了很多地方,尝试了很多解决方案,但是我找不到解决这个问题的方法,世界上真的有办法做到这一点。

这些是我的 Firebase 文档,以便更好地了解我的数据库;

Car List Document

Plane List Document

Motor List Document

All List Document

【问题讨论】:

  • 试试"models.${item[i]}"。现在输出应该是models.car 等等。 DartPad 上的示例

标签: firebase flutter google-cloud-firestore


【解决方案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");  
}

两个sn-ps之间的结果是一样的,我只是觉得第二个版本更容易维护。

【讨论】:

  • 非常感谢,我已经处理这个问题大约一个月了。
猜你喜欢
  • 2021-10-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2021-09-01
  • 2021-09-26
  • 2018-05-05
  • 1970-01-01
相关资源
最近更新 更多