Используйте jugglingdb, чтобы выбрать результаты, где идентификатор существует в другой таблице
Я пытаюсь использовать jugglingdb (и адаптер mysql), чтобы получить список пациентов. Наша схема настроена таким образом, что пациент должен быть пользователем, но пользователь не обязательно должен быть пациентом. Это означает, что у пациента есть идентификатор пользователя, а в таблице "Пользователь" содержится имя пациента.
Patient
id
userId
User
id
givenName
familyName
middleInitial
Когда начальные страницы были созданы, мы просто использовали Patient.all
чтобы получить результаты, и patient.user(...
захватить пользовательский объект / имя пользователя. Это хорошо для небольшого количества записей, но не для тысяч записей.
Как получить список пользователей, только если их идентификатор указан в таблице пациентов? Пример запроса MySQL:
SELECT * FROM User WHERE id IN (SELECT id FROM Patient) AND familyName LIKE '%doe%';
Я уже некоторое время просматриваю адаптер jugglingdb-mysql и не нашел идеального решения, в противном случае этот вопрос - единственное другое решение, которое я нашел до сих пор.
Другой вариант / запрос, который я мог бы использовать, - это создание внутреннего соединения между пациентом и пользователем, а затем фильтрация результатов:
SELECT Patient.id
,User.familyName
FROM Patient
INNER JOIN User ON Patient.userId = User.id
WHERE User.familyName LIKE '%doe%';
Но опять же, я не нашел решения для объединений с использованием 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.