关联对象

因为 Sequelize 做了很多神奇的事,所以你必须在设置关联后调用 Sequelize.sync. 这样做将允许你进行以下操作:

  1. Project.hasMany(Task)
  2. Task.belongsTo(Project)
  3. Project.create()...
  4. Task.create()...
  5. Task.create()...
  6. // 保存它们.. 然后:
  7. project.setTasks([task1, task2]).then(() => {
  8. // 已保存!
  9. })
  10. // 好的,现在它们已经保存了...我怎么才能得到他们?
  11. project.getTasks().then(associatedTasks => {
  12. // associatedTasks 是一个 tasks 的数组
  13. })
  14. // 你还可以将过滤器传递给getter方法.
  15. // 它们与你能传递给常规查找器方法的选项相同.
  16. project.getTasks({ where: 'id > 10' }).then(tasks => {
  17. // id大于10的任务
  18. })
  19. // 你也可以仅检索关联对象的某些字段.
  20. project.getTasks({attributes: ['title']}).then(tasks => {
  21. // 使用属性“title”和“id”检索任务
  22. })

要删除创建的关联,你可以调用set方法而不使用特定的ID:

  1. // 删除与 task1 的关联
  2. project.setTasks([task2]).then(associatedTasks => {
  3. // 你将只得到 task2
  4. })
  5. // 删除全部
  6. project.setTasks([]).then(associatedTasks => {
  7. // 你将得到空数组
  8. })
  9. // 或更直接地删除
  10. project.removeTask(task1).then(() => {
  11. // 什么都没有
  12. })
  13. // 然后再次添加它们
  14. project.addTask(task1).then(() => {
  15. // 它们又回来了
  16. })

反之亦然你当然也可以这样做:

  1. // project与task1和task2相关联
  2. task2.setProject(null).then(() => {
  3. // 什么都没有
  4. })

对于 hasOne/belongsTo 与其基本相同:

  1. Task.hasOne(User, {as: "Author"})
  2. Task.setAuthor(anAuthor)

可以通过两种方式添加与自定义连接表的关系的关联(继续前一章中定义的关联):

  1. // 在创建关联之前,通过向对象添加具有连接表模型名称的属性
  2. project.UserProjects = {
  3. status: 'active'
  4. }
  5. u.addProject(project)
  6. // 或者在添加关联时提供第二个options.through参数,其中包含应该在连接表中的数据
  7. u.addProject(project, { through: { status: 'active' }})
  8. // 关联多个对象时,可以组合上述两个选项. 在这种情况下第二个参数
  9. // 如果没有提供使用的数据将被视为默认对象
  10. project1.UserProjects = {
  11. status: 'inactive'
  12. }
  13. u.setProjects([project1, project2], { through: { status: 'active' }})
  14. // 上述代码将对项目1记录无效,并且在连接表中对项目2进行active

当获取具有自定义连接表的关联的数据时,连接表中的数据将作为DAO实例返回:

  1. u.getProjects().then(projects => {
  2. const project = projects[0]
  3. if (project.UserProjects.status === 'active') {
  4. // .. 做点什么
  5. // 由于这是一个真正的DAO实例,你可以在完成操作之后直接保存它
  6. return project.UserProjects.save()
  7. }
  8. })

如果你仅需要连接表中的某些属性,则可以提供具有所需属性的数组:

  1. // 这将仅从 Projects 表中选择 name,仅从 UserProjects 表中选择status
  2. user.getProjects({ attributes: ['name'], joinTableAttributes: ['status']})