AngularFire:如何运行连接查询

时间:2016-11-28 16:54:12

标签: firebase-realtime-database angularfire

我正在一个项目中工作,我有这些实体:区域,消息以及区域和消息之间的链接。在此链接中,我还可以配置一些额外的属性,例如,如果某个区域的消息可以多次显示,并且之前是否有要显示的先决条件消息。

我的基本数据库概念: enter image description here

以下是我制作数据库的方法: enter image description here

我希望能够显示包含消息名称,show标志和先决条件消息名称的列表(如果已填写)。

我正在使用$ firebaseArray对象来执行我的常规列表,我已经看到了当你有这样的结构时如何进行查询的示例:

"region_messages":{  
   "xxxxxxx":true,
   "yyyyyyy":true
}

在我的情况下,我怎么能做,我的结构更复杂。我正在尝试使用angularfire进行查询,我需要在Swift 3中进行相同的操作。

感谢您的帮助!

这是我的json树,以防您想要运行一些测试:

{
  "messages" : {
    "-KXSIeKHTM4lMRbeey2k" : {
      "active" : true,
      "name" : "link",
      "type" : 3,
      "url" : "http://www.google.com"
    },
    "-KXSIi_qw369nfU28lJJ" : {
      "active" : true,
      "name" : "video",
      "type" : 4,
      "url" : "http://www.youtube.com"
    }
  },
  "region_messages" : {
    "-KXfZYP8e--ZUgaVM9iL" : {
      "-KXSIeKHTM4lMRbeey2k" : {
        "pre_requisite_message_id" : "",
        "show_only_once" : false
      },
      "-KXSIi_qw369nfU28lJJ" : {
        "pre_requisite_message_id" : "-KXSIeKHTM4lMRbeey2k",
        "show_only_once" : true
      }
    }
  },
  "regions" : {
    "-KXfZYP8e--ZUgaVM9iL" : {
      "major" : 1,
      "name" : "Region 1"
    }
  }
}

1 个答案:

答案 0 :(得分:1)

我按照this video中的说明操作,然后设法解决了问题。对我进行后续通话听起来很奇怪,但我猜它没有太多麻烦。功能:

$scope.getMessagesByRegion = function(regionId){

    var rootRef = firebase.database().ref();
    var regionMessagesRef = rootRef.child("region_messages/"+ regionId);
    $scope.messages_by_region = []; // Here I reset the scope variable

    regionMessagesRef.on('child_added', function(rmSnap) {

        var messageRef = rootRef.child("messages/"+rmSnap.key);
        messageRef.once('value').then(function(msgSnap){

            var msg = {
                key : msgSnap.key,
                name : msgSnap.val().name,
                type : $scope.getTypeName(msgSnap.val().type),
                show_only_once : rmSnap.val().show_only_once,
                pre_requisite_message : rmSnap.val().pre_requisite_message
            }

            $scope.$apply(function(){
                $scope.messages_by_region.push(msg);
            });
        })

    });
}

对于swift(iOS),我必须这样做。到目前为止表现似乎很好。