我正在尝试使用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连接的解决方案。
答案 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本身内部。