关联对象
因为 Sequelize 做了很多神奇的事,所以你必须在设置关联后调用 Sequelize.sync
. 这样做将允许你进行以下操作:
Project.hasMany(Task)
Task.belongsTo(Project)
Project.create()...
Task.create()...
Task.create()...
// 保存它们.. 然后:
project.setTasks([task1, task2]).then(() => {
// 已保存!
})
// 好的,现在它们已经保存了...我怎么才能得到他们?
project.getTasks().then(associatedTasks => {
// associatedTasks 是一个 tasks 的数组
})
// 你还可以将过滤器传递给getter方法.
// 它们与你能传递给常规查找器方法的选项相同.
project.getTasks({ where: 'id > 10' }).then(tasks => {
// id大于10的任务
})
// 你也可以仅检索关联对象的某些字段.
project.getTasks({attributes: ['title']}).then(tasks => {
// 使用属性“title”和“id”检索任务
})
要删除创建的关联,你可以调用set方法而不使用特定的ID:
// 删除与 task1 的关联
project.setTasks([task2]).then(associatedTasks => {
// 你将只得到 task2
})
// 删除全部
project.setTasks([]).then(associatedTasks => {
// 你将得到空数组
})
// 或更直接地删除
project.removeTask(task1).then(() => {
// 什么都没有
})
// 然后再次添加它们
project.addTask(task1).then(() => {
// 它们又回来了
})
反之亦然你当然也可以这样做:
// project与task1和task2相关联
task2.setProject(null).then(() => {
// 什么都没有
})
对于 hasOne/belongsTo 与其基本相同:
Task.hasOne(User, {as: "Author"})
Task.setAuthor(anAuthor)
可以通过两种方式添加与自定义连接表的关系的关联(继续前一章中定义的关联):
// 在创建关联之前,通过向对象添加具有连接表模型名称的属性
project.UserProjects = {
status: 'active'
}
u.addProject(project)
// 或者在添加关联时提供第二个options.through参数,其中包含应该在连接表中的数据
u.addProject(project, { through: { status: 'active' }})
// 关联多个对象时,可以组合上述两个选项. 在这种情况下第二个参数
// 如果没有提供使用的数据将被视为默认对象
project1.UserProjects = {
status: 'inactive'
}
u.setProjects([project1, project2], { through: { status: 'active' }})
// 上述代码将对项目1记录无效,并且在连接表中对项目2进行active
当获取具有自定义连接表的关联的数据时,连接表中的数据将作为DAO实例返回:
u.getProjects().then(projects => {
const project = projects[0]
if (project.UserProjects.status === 'active') {
// .. 做点什么
// 由于这是一个真正的DAO实例,你可以在完成操作之后直接保存它
return project.UserProjects.save()
}
})
如果你仅需要连接表中的某些属性,则可以提供具有所需属性的数组:
// 这将仅从 Projects 表中选择 name,仅从 UserProjects 表中选择status
user.getProjects({ attributes: ['name'], joinTableAttributes: ['status']})