SailsJs - объединение нескольких моделей с критериями для всех объединенных моделей
Ниже моя модель данных,
Школа:
- SchoolID
- название
- Статус
Игра:
- SchoolID
- GameID
- название
- Статус
Участники:
- SchoolID
- GameID
- Студенческий билет
- название
- Статус
Я хочу показать "Участники" на основе "Статус" из "Участники", "Школа" и "Игра". Можно ли отфильтровать результаты при получении?
Запрос, который я хочу выполнить,
select *
from
Participants
inner join Game on Participants.GameID = Game.GameID
inner join School on Game.SchoolID = School.SchoolID
where
Participants.Status="Active"
and Game.Status="Active"
and School.Status="Active"
Как я могу добиться этого, используя ассоциацию моделей sailsjs?
1 ответ
В Sails.js/Waterline нет встроенного способа заполнения глубоких вложенных ассоциаций.
Вам нужно установить такие модели:
Игра:
attributes:{
SchoolID:{
model: 'School'
}
// rest of attributes
}
Участники:
attributes:{
SchoolID:{
model: 'School'
},
GameID:{
model: 'Game'
}
// rest of attributes
}
Чем запрос:
Game.find({Status:"Active"})
.populate("School",{
where: {
Status: "Active"
}
})
.populate("Participants",{
where: {
Status: "Active"
}
}).exec(function (err, result){
return result
});
И теперь это сложная часть. Вы получите массив с активными играми. Не имеет значения, есть ли у них активные школы или участники. В результате будет 2 подмассива: Участники и Школа. Если они не пусты, это ваш результат.
[
{
SchoolID: [],
GameID: [],
Name: '',
Status: ''
},
{
SchoolID: [SchoolID: 1, Name: '', Status: 'Active'],
GameID: [SchoolID: 1, GameID: 1, Name: '', Status: 'Active'],
Name: '',
Status: ''
}
]
Вы можете использовать фильтр lodash для очистки результатов.
Второе решение гораздо проще - это использование .query()
Вы можете просто использовать свой запрос, который вы написали:
School.query('select * from Participants inner join Game on Participants.GameID=Game.GameID inner join School on Game.SchoolID=School.SchoolID where Participants.Status="Active" and Game.Status="Active" and School.Status="Active"', function(err, results) {
return results;
});