Используйте 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.

Другие вопросы по тегам