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

Posted

技术标签:

【中文标题】如何查询firebase的多对多关系?【英文标题】:How to query firebase for many to many relationship? 【发布时间】:2017-03-16 11:21:27 【问题描述】:

这是我第一次开发 SPA,我没有使用 React、Vue 或 Angular 等 JS 框架。我的项目只是使用 firebase sdk 和 jquery 来访问 DOM 元素。

在我的应用中,用户可以与项目相关联。从那以后,我有一个 user-projectsproject-users 路径来表示这种关系。

当用户登录我的应用程序时,我请求 users/uid 获取用户数据。之后,我必须获取与用户关联的项目。我会拿关联项目的id来最终请求各个项目的数据。

我正在尝试使用here 中描述的承诺,但我在控制台中什么也得不到。

function loadUserProjects() 
    // Authenticated user
    var user = firebase.auth().currentUser;

    // General reference to the real time db
    var ref = firebase.database().ref();

    // Request the user data
    ref.child('users/'+user.uid).on('value').then(function(snapshot) 
        var user_data = snapshot.val(); console.log(user_data);

        // Global variable to store the id of the selected project
        project_selected_key = user_data.project_selected;

        // Get the list of associated projects
        return ref.child('user-projects/'+user.uid).on('value').then(function(snapshot) 
            console.log(snapshot);
            return snapshot;
        );
    ).then(function (projectsSnapshot) 
        console.log(projectsSnapshot);

        // List associated projects
        var project_options = '';
        projectsSnapshot.forEach(function (e) 
            project_options += '<option value="'+e.key+'">'+e.val()+'</option>';
        );
        if (! project_options) 
            project_options = '<option disabled selected value>- Ningún proyecto -</option>';
        

        $('#project_selected').html(project_options);
    , function(error) 
        // Something went wrong.
        console.error(error);
    );

我知道我必须使用一个额外的请求,因为此时&lt;select&gt;将填充true值(额外的请求必须查询每个项目的完整数据)。但我没有在控制台中收到消息。

提前致谢。

之后,我需要在每个项目中定义不同的权限级别,并在将项目分配给特定用户时关联一个级别。最初我对实时感到非常兴奋,但似乎 firebase 变得比我想象的要复杂。

【问题讨论】:

【参考方案1】:

Firebase on() 侦听器可以响应多个事件。一个 Promise 只能解析一次,这就是为什么它只有在您使用 Firebase 的 once() 操作时才可用。

return ref.child('user-projects/'+user.uid).once('value');

【讨论】:

谢谢。现在我在数组project_keys 中有项目键。使用ref.child('projects/'+project_keys[i]).once('value') 我可以获得一个项目的项目数据。如何使用数组在一个请求中获取所有内容?

以上是关于如何查询firebase的多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeORM 与 GraphQL 的多对多关系上使用数据加载器,查询多对多

雄辩的多对多对多 - 如何轻松加载远距离关系

在 Laravel 中查询用户的多对多关系

针对特定集合的多对多关系核心数据查询

Mybatis的多表(多对多)查询

在 laravel 中搜索查询并计算结果的多对多关系