使用jugglingdb选择另一个表中存在id的结果

时间:2013-09-25 19:23:48

标签: mysql node.js jugglingdb

我正在尝试使用jugglingdb(和mysql适配器)来获取患者列表。我们的架构设置为患者必须是用户,但用户不必是患者。这意味着患者具有userId,并且User表保存患者的姓名。

Patient
    id
    userId
User
    id
    givenName
    familyName
    middleInitial

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

如果在患者表格中引用了他们的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连接的解决方案。

1 个答案:

答案 0 :(得分: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本身内部。