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;
});
Другие вопросы по тегам