查询和改变firebase实时数据库多对多(双向)关系

Posted

技术标签:

【中文标题】查询和改变firebase实时数据库多对多(双向)关系【英文标题】:querying and mutating firebase realtime database many to many (two way) relationships 【发布时间】:2020-03-14 11:27:18 【问题描述】:

我一直在阅读文档 https://firebase.google.com/docs/database/web/read-and-write 还有不少网上的例子。但这是断开连接:在向数据库添加对象时,它们似乎都没有考虑从 firebase 随机生成的 id。

根据我的研究,扁平化数据是可行的方法。所以我已经构建了我的数据:

但添加播放器时,例如:

我如何不仅将他添加到玩家对象,还添加到 team_memberships 对象? 然后,团队对象如何知道如何引用 播放器以及在哪里这样做?

这是我的客户端代码(javascript (Vue + Typescript)):

addPlayer( state , payload) 
    const user = firebase.auth().currentUser;
    if (user) 
      firebase
        .database()
        .ref('users').child(user.uid).child('players')
        .push(
          firstName: payload.firstName,
          lastName: payload.lastName,
          jerseyNumber: payload.jerseyNumber,
          teamName: payload.teamName
        );
    
  ,

【问题讨论】:

【参考方案1】:

您必须使用update() 方法,该方法允许“一次将多个值写入数据库”(另请参阅here):

这是第一种情况的示例(“我如何不仅将他添加到 player 对象,还添加到 team_memberships 对象”)。

var userObj = 
    firstName: payload.firstName,
    lastName: payload.lastName,
    jerseyNumber: payload.jerseyNumber,
    teamName: payload.teamName
;

var team_id = '....'  //I don't know how you plan to get this value.

var newPlayerKey = firebase.database().ref('users').child(user.uid).child('players').push().key;

var updates = ;
updates['/users/' + user.uid + '/players/' + newPlayerKey] = userObj;
updates['/users/' + user.uid + '/team_memberships/' + team_id + '/' + newPlayerKey] = true;

return firebase.database().ref().update(updates);

注意:我不知道您打算如何获取 team_id 的值,但很可能来自前端,因为您有 teamName

【讨论】:

@Khepf 嗨,您有时间查看建议的解决方案吗? 我今天刚回来,这正是我的想法,谢谢!!!

以上是关于查询和改变firebase实时数据库多对多(双向)关系的主要内容,如果未能解决你的问题,请参考以下文章

hibernate多对多查询

Firebase简单多对多关系

如何查询firebase的多对多关系?

Hibernate 单向/双向 多对多

如何查询和改变表中的“多对多”字段?

Firebase 中的多对多关系