簡體   English   中英

Sequelize.js,如何插入一對多對多關系的模型

[英]Sequelize.js,How to insert a model with one to many to many relationship

我正在使用 sequlize.js 創建一個一對多的模型,它可以工作,但我想創建一個一對多對多的模型,我不知道從哪里開始

現在我已經定義了三個模型,下面是它們的關系

  1. 項目
Projects.associate = () => {
    Projects.Colors = Projects.hasMany(ProjectColors, { foreignKey: 'project_id', sourceKey: 'id' });
  };
  1. 項目顏色
ProjectColors.associate = () => {
    Projects.Sizes = ProjectColors.hasMany(ProjectSizes, { foreignKey: 'project_color_id', sourceKey: 'id' });
  };
  1. 項目規模

有一個對象,我想通過項目模型創建

const project = {
  name: 'xxproject',
  colors:[
    {
      color: 'red',
      sizes:[
        {size: 'L'}
      ]
    },
    {
      color: 'bule',
      sizes:[
        {size: 'L'},
        {size: 'M'}
      ]
    },
  ]
}

我嘗試了像 Office Document 這樣的一對多,它可以很好地工作如下

await Projects.create(project, {
  include: [ Projects.Colors ],
});

如果我更改代碼,它會出錯

await Projects.create(project, {
      include: [{
        model: Projects.Colors,
      }],
    });

這是錯誤堆棧

2019-04-04 10:57:10,074 ERROR 60510 [-/127.0.0.1/-/20ms POST /api/v1/projects] nodejs.TypeError: self._expandAttributes is not a function
    at Function._conformOptions (/Users/jaytam/school/garment-production-backend/node_modules/sequelize/lib/model.js:198:12)
    at Function._conformInclude (/Users/jaytam/school/garment-production-backend/node_modules/sequelize/lib/model.js:264:12)
    at options.include.options.include.map.include (/Users/jaytam/school/garment-production-backend/node_modules/sequelize/lib/model.js:213:59)
    at Array.map (<anonymous>)
    at Function._conformOptions (/Users/jaytam/school/garment-production-backend/node_modules/sequelize/lib/model.js:213:39)
    at new Model (/Users/jaytam/school/garment-production-backend/node_modules/sequelize/lib/model.js:3070:24)
    at new projects (/Users/jaytam/school/garment-production-backend/node_modules/sequelize/lib/sequelize.js:340:19)
    at Function.build (/Users/jaytam/school/garment-production-backend/node_modules/sequelize/lib/model.js:1966:12)
    at Function.create (/Users/jaytam/school/garment-production-backend/node_modules/sequelize/lib/model.js:2017:17)
    at ProjectController.create (/Users/jaytam/school/garment-production-backend/app/controller/projects.js:42:20)
    at Object.callFn (/Users/jaytam/school/garment-production-backend/node_modules/egg-core/lib/utils/index.js:44:21)
    at Object.classControllerMiddleware (/Users/jaytam/school/garment-production-backend/node_modules/egg-core/lib/loader/mixin/controller.js:87:20)
    at Object.callFn (/Users/jaytam/school/garment-production-backend/node_modules/@eggjs/router/lib/utils.js:12:21)
    at wrappedController (/Users/jaytam/school/garment-production-backend/node_modules/@eggjs/router/lib/egg_router.js:322:18)
    at dispatch (/Users/jaytam/school/garment-production-backend/node_modules/@eggjs/router/node_modules/koa-compose/index.js:44:32)
    at next (/Users/jaytam/school/garment-production-backend/node_modules/@eggjs/router/node_modules/koa-compose/index.js:45:18)
    at /Users/jaytam/school/garment-production-backend/node_modules/@eggjs/router/lib/router.js:190:18
    at dispatch (/Users/jaytam/school/garment-production-backend/node_modules/@eggjs/router/node_modules/koa-compose/index.js:44:32)
    at /Users/jaytam/school/garment-production-backend/node_modules/@eggjs/router/node_modules/koa-compose/index.js:36:12
    at dispatch (/Users/jaytam/school/garment-production-backend/node_modules/@eggjs/router/lib/router.js:195:33)
    at dispatch (/Users/jaytam/school/garment-production-backend/node_modules/koa-compose/index.js:42:32)
    at /Users/jaytam/school/garment-production-backend/app/middleware/handleGetInt.js:22:11

事實上,我想這樣編碼,但上面的代碼不起作用

await Projects.create(project, {
      include: [{
        model: Projects.Colors,
        include: [{
          model: Projects.Sizes,
        }],
      }],
    });

在 Travis Haby 建議之后,我重試

我模仿 Sequlize.js 文檔,改變他們的關系定義

Projects.Colors = app.model.ProjectColors.belongsTo(Projects, { foreignKey: 'project_id', targetKey: 'id' });
app.model.ProjectColors.Sizes = app.model.ProjectColors.hasMany(app.model.ProjectSizes, { foreignKey: 'project_color_id', sourceKey: 'id' });

創建代碼

await Projects.create(project, {
      association: Projects.Colors,
      include: [ ProjectColors.Sizes ],
});

或者

    await Projects.create(project, {
      include: [{
        association: Projects.Colors,
        include: [{
          association: ProjectColors.Sizes,
        }],
      }],
    })

兩種方式只創建項目,每種方式都沒有創建顏色和大小

[2019-04-04 14:22:15.564] [cfork:master:60831] worker:60969 exit (code: 0, exitedAfterDisconnect: true, state: dead, isDead: true, isExpected: true, worker.disableRefork: false)
{ name: 'sadqw',
  cycle: 230,
  fund: 1230123,
  manage_by: 'dsa',
  project_colors: [ { color: 'asd', imageUrl: '', project_sizes: [Array] } ],
  status: '0' }
2019-04-04 14:26:24,276 INFO 60980 [egg-sequelize](1ms) Executed (default): INSERT INTO `projects` (`id`,`name`,`cycle`,`fund`,`manage_by`,`created_at`,`updated_at`,`status`) VALUES (DEFAULT,'sadqw',230,1230123,'dsa','2019-04-04 06:26:24','2019-04-04 06:26:24','0');

根據續集文檔的這一部分,您應該能夠按如下方式嵌套(取決於您使用的sequelize版本):

return Projects.create(project, {
  include: [{
    association: Projects.Colors,
    include: [ Colors.Sizes ]
  }]
});

乍一看,你有Projects.ColorsProjects.Sizes ,但我認為它應該是Colors.Sizes因為那是多對多的關系。

希望有幫助!

首先,嘗試將 projectColors 關聯更改為此(假設您收到models作為參數):

ProjectColors.associate = () => {
    ProjectColors.Sizes = ProjectColors.hasMany(models.project_size, { foreignKey: 'project_color_id', sourceKey: 'id' });
    ProjectColors.Projects = ProjectColors.belongsTo(models.project)
};

其次,嘗試添加到 ProjectSizes:

ProjectSizes.associate = () => {
    ProjectSizes.Colors = ProjectSizes.belongsTo(models.project_color, { foreignKey: 'project_color_id'});
};

注意:模型名稱(您在models.之后使用)是模型定義中定義的名稱( Sequelize.define([modelname] )。

如果有幫助,請告訴我。

我相信創建應該是這樣的:

await Projects.create(project, {
      include: [{
        association: Projects.Colors,
        include: [ ProjectColors.Sizes ]
      }]
    });

我再試一次,效果很好。 感謝@Sagi Rika 和@Travis Haby

其實就是這么簡單

Projects.associate = () => {
    Projects.Colors = Projects.hasMany(ProjectColors, { foreignKey: 'project_id', sourceKey: 'id' });
  };
ProjectColors.associate = () => {
    Projects.Sizes = ProjectColors.hasMany(ProjectSizes, { foreignKey: 'project_color_id', sourceKey: 'id' });
  };

並調用 create 方法如下

    Projects.create(project, {
      include: [{
        association: Projects.Colors,
        include: [{
          association: Projects.Sizes,
        }],
      }],
    })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM