2016-11-28 32 views
0

我正在一个项目中,我有这些实体:区域,消息和区域和消息之间的链接。在这个链接中,我还可以配置一些额外的属性,例如消息是否可以针对某个区域显示多次,以及是否有先前显示的先决条件消息。AngularFire:如何运行连接查询

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

下面就是我正在做我的数据库: enter image description here

我希望能够证明该消息的名称列表,节目标志和先决条件消息的名称(如果已填写)。

我使用$ 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" 
    } 
    } 
} 
+0

查看http://stackoverflow.com/questions/30299972/joining-data-between-paths-based-on-id-using-angularfire –

+0

@FrankvanPuffelenI看到之前问,这就是为什么我把一块json我的问题结束了。这是不一样的,虽然我试图,使用NormalizedCollection –

+0

这确实是一个不同于Normalized Collection可以处理的联接。但是这个答案中的其他选项应该可以正常工作,您需要扩展'$ firebaseArray'。 –

回答

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)我必须这样做。迄今为止表现似乎不错。