Sequelize ORM
我有一个具有三个模型的架构:School,Teacher和Student。一所学校可以有多个老师和多个学生。
我可以通过Sequelize来获得schools
的列表:
return School.findAll({
include: [
{ model: Teacher },
{ model: Student },
],
});
将这样生成JSON的结果:
[{
id: 'dc85fe6a-c009-4055-9852-e2c3c0b37e9b,
teachers: [ ... ],
students: [ ... ]
}]
[现在,我希望JSON还包括一个名为people
的属性,该属性包含会话的teachers
和students
。换句话说,JSON应该如下所示:
[{
id: 'dc85fe6a-c009-4055-9852-e2c3c0b37e9b,
people: [ ... ], // Should contain teachers and students.
teachers: [ ... ],
students: [ ... ]
}]
我如何像这样将多个关系“包含”到单个属性中?任何帮助将不胜感激。
回答如下:我认为您无法通过续集实现这一目标。但是,使用继承模式通常会使您的用例更好地工作。想一想,学生和老师有什么共同点?他们都是人类,因此人类具有的任何属性都是两者共同的。
这是我要做的:
- 具有一个名为
Person
的模型,其中包含所有常用属性(名字,姓氏,出生日期...) - 还有另外两个模型,
Student
和Teacher
,包含特定属性 - 定义
one to one
/Student
和Teacher
之间的Person
关系。注意,只能以一种方式定义它(Student
是Person
,但Person
并不总是Student
) - 从
one to many
到School
定义Person
关系。
这样,您将可以通过执行以下操作来实现所需的目标:
return School.findAll({
include: [
{
model: Person,
include: [
{ model: Teacher },
{ model: Student },
]
},
],
});
而且,恕我直言,我认为该模型在归一化方面会更合适。