【问题标题】:Sequelize ORM - Include two relationships as a single parent propertySequelize ORM - 包括两个关系作为单个父属性
【发布时间】:2019-10-03 06:41:47
【问题描述】:

我有一个包含三个模型的架构:学校教师学生
一所学校可以有多名教师和多名学生。

我可以像这样使用 Sequelize 获得schools 的列表:

return School.findAll({
    include: [
        { model: Teacher },
        { model: Student },
    ],
});

这会导致这样的 JSON:

[{
    id: 'dc85fe6a-c009-4055-9852-e2c3c0b37e9b,
    teachers: [ ... ],
    students: [ ... ]
}]

现在,我希望 JSON 还包含一个名为 people 的属性,其中包含会话的 teachersstudents
换句话说,JSON 应该是这样的:

[{
    id: 'dc85fe6a-c009-4055-9852-e2c3c0b37e9b,
    people: [ ... ], // Should contain teachers and students.
    teachers: [ ... ],
    students: [ ... ]
}]

如何将多个关系“包含”到这样的单个属性中?
任何帮助将不胜感激。

【问题讨论】:

    标签: node.js express sequelize.js


    【解决方案1】:

    我认为您无法使用 sequelize 实现这一目标。但是,您的用例通常会使用继承模式更好地工作。想一想,学生和老师有什么共同点?他们都是人,所以一个人所具有的任何属性都是双方共有的。

    我会这样做:

    • 有一个名为 Person 的模型,包含所有常见属性(名字、姓氏、出生日期...)
    • 有两个其他模型,StudentTeacher,包含特定属性
    • 定义Student/TeacherPerson之间的one to one关系。请注意,您只能以一种方式定义它(StudentPerson,但 Person 并不总是 Student
    • 定义从SchoolPersonone to many 关系。

    这样,您将能够通过执行以下操作来实现您想要的:

    return School.findAll({
        include: [
            {
                model: Person,
                include: [
                    { model: Teacher },
                    { model: Student },
                ]
            },
        ],
    });
    

    而且,恕我直言,我相信这个模型在标准化方面会更合适。

    【讨论】:

    • 感谢您的回复。即使 Person 模型没有定义的属性(除了必要的键),这也能工作吗?我问是因为当我使用Marker interface pattern:en.wikipedia.org/wiki/Marker_interface_pattern 时通常会遇到类似的问题。所以回到最初的例子,假设我知道我从不希望学生模型和教师模型具有共同的属性。这仍然是最好的方法吗?
    • 我没有尝试,但我看不出为什么它不能只使用 id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多