【问题标题】:Use jugglingdb to select results where an id exists in another table使用 jugglingdb 选择另一个表中存在 id 的结果
【发布时间】:2013-10-01 13:11:04
【问题描述】:

我正在尝试使用 jugglingdb(和 mysql 适配器)来获取患者列表。我们的模式设置为患者必须是用户,但用户不必是患者。这意味着 Patient 有一个 userId,而 User 表中保存着患者的姓名。

Patient
    id
    userId
User
    id
    givenName
    familyName
    middleInitial

创建初始页面时,我们简单地使用Patient.all 来获取结果,并使用patient.user(... 来获取用户对象/用户名。这适用于少量记录,但不适用于数千条记录。

只有在 Patient 表中引用了他们的 id 时,我如何获取用户列表? mysql查询示例:

SELECT * FROM User WHERE id IN (SELECT id FROM Patient) AND familyName LIKE '%doe%';

我已经浏览了一段时间jugglingdb-mysql adapter 并没有找到理想的解决方案,否则,this question 是我迄今为止找到的唯一其他解决方案。

我可以使用的另一种替代方法/查询是在 Patient 和 User 之间创建一个内部连接,然后过滤结果:

SELECT Patient.id
      ,User.familyName
FROM Patient 
    INNER JOIN User ON Patient.userId = User.id 
WHERE User.familyName LIKE '%doe%';

但同样,我还没有找到使用 jugglingdb 进行连接的解决方案。

【问题讨论】:

    标签: mysql node.js jugglingdb


    【解决方案1】:

    只要关系存在,您始终可以使用包含功能。例如:

    Patient.belongsTo(User, { as: 'user', foreignKey: 'userId' });
    
    // Empty callback for async getter.
    var c = function () { };
    
    Patient.all({ 
        where: { blah: blash }, 
        include: [ 'user' ] 
    }, function (err, patients) {
            var user = patients[0].user(c);
        }
    );
    

    您甚至可以在关系中包含关系。例如:

    Role.belongsTo(User, { as: 'role', foreignKey: 'roleId' });
    
    Patient.all({ 
        where: { blah: blash }, 
        include: [ { user: 'role' } ]
    }, function (err, patients) {
            var user     = patients[0].user(c);
            var userRole = user.role(c);
        }
    );
    

    请务必注意,有时返回的关系对象(例如“角色”对象)可能是只读的。我还没有深入挖掘这背后的原因,所以我不能给你一个自信的答案来告诉你为什么会发生这种情况,如何发生,或者发生在哪里,但我相信它可能在 JugglingDB 本身内部。

    【讨论】:

    • 我还必须提到这仅适用于多对一关系,而不适用于多对多关系。但是,有一个 fork 支持包含多对多关系
    • 如果我运行第一个示例,它将执行SELECT * FROM Patient,然后是SELECT * FROM User WHERE id in ...。如果 Patient 表有数千或数百万个结果,这将不理想。
    猜你喜欢
    • 2018-03-20
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多