首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Sequelize :插入值时一对多关系不起作用

Sequelize :插入值时一对多关系不起作用
EN

Stack Overflow用户
提问于 2018-06-05 00:46:57
回答 3查看 3.3K关注 0票数 3

我得到了两个对象之间的一对多关系: Dashboard和Chart,描述如下:

代码语言:javascript
复制
module.exports = function (sequelize, DataTypes) {
  const Dashboard = sequelize.define('Dashboard', {
      id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    title: {
      type: DataTypes.STRING
    }
  });

  Dashboard.associate = (models) => {
    Dashboard.belongsTo(models.User, {
      foreignKey: 'user_id',
      targetKey: 'id'
    });

    Dashboard.hasMany(models.Chart, {
      foreignKey: 'dashboard_id',
      sourceKey: 'id'
    });
  };

  return Dashboard;
};

和:

代码语言:javascript
复制
module.exports = function(sequelize, DataTypes) {
  var Chart = sequelize.define('Chart', {
      id: {
        type: DataTypes.INTEGER(32),
        primaryKey: true,
        autoIncrement: true
      },
      title: {
        type: DataTypes.STRING,
        allowNull: false
      },
      x_title: {
        type: DataTypes.STRING
      },
      y_title: {
        type: DataTypes.STRING
      },
      data_type: {
        type: DataTypes.STRING,
        allowNull: false
      },
      data_value: {
        type: DataTypes.STRING,
        allowNull: false
      },
      filters: {
        type: DataTypes.TEXT,
        allowNull: false
      }
    }
  );

  Chart.associate = (models) => {
    Chart.belongsTo(models.Dashboard, {
      foreignKey: 'dashboard_id',
      targetKey: 'id'
    });
  };

  return Chart;
};

因此,当我想要添加一个包含多个图表的新仪表板时,如下所示:

代码语言:javascript
复制
models.Dashboard.create({
    user_id: 1,
    title: 'Dashboard title',
    charts: [
      {
        title: 'time',
        x_title: 'Days',
        y_title: 'Count',
        data_type: 'count',
        data_value: 'visit',
        filters: '[{"type":"project","values":["1"]},{"type":"language","values":["french"]},{"type":"satisfaction","values":[1,2,3]}]'
      },
      {
        title: 'indicator',
        x_title: '',
        y_title: '',
        data_type: 'count',
        data_value: 'visit',
        filters: '[{"type":"project","values":["1","2","3","4","5","6"]},{"type":"language","values":["french"]}]'
      }
    ]
  }, { include: [models.Chart] }).then(() => {
    res.send({
      'message': 'Dashboard loaded !'
    });
  });

仪表板已插入到数据库中,但也未插入图表...使用Sequelize添加具有一对多关联的记录的最佳方法是什么?我只是试了又试,并阅读了所有文档(http://docs.sequelizejs.com/manual/tutorial/associations.html#creating-with-associations),但我不理解这种有问题的行为……

感谢您的帮助和启发!

EN

回答 3

Stack Overflow用户

发布于 2018-06-05 08:17:23

在定义的关联中

代码语言:javascript
复制
Dashboard.hasMany(models.Chart, {
      foreignKey: 'dashboard_id',
      sourceKey: 'id'
    });

foreignKey被提到为dashboard_id,但在Chart模型中没有dashboard_id

以下代码可以正常工作

代码语言:javascript
复制
const Dashboard = sequelize.define('dashboard', {
  title: Sequelize.STRING,
});

const Chart = sequelize.define('chart', {
  dashboard_id: Sequelize.INTEGER,
  title: Sequelize.STRING,
});

Dashboard.hasMany(Chart, {
  foreignKey: 'dashboard_id',
  sourceKey: 'id'
});
Dashboard.create({
  title: 'one',
  charts: [
    { title: 'title1' },
    { title: 'title2' }
  ]
}, { include: [Chart] }).then((result) => {
  console.log(result);
});
票数 1
EN

Stack Overflow用户

发布于 2018-06-05 17:20:05

谢谢您的帮助,但我需要一个双向的一对多关联。

照你说的做,我还是有同样的问题...我不明白为什么,也许是因为我使用Sequelize CLI,每个对象定义都有一个JS文件……或者没有在正确的时刻调用Sequelize sync函数。

奇怪的是,当我首先插入仪表板,然后通过定义图表的dashboard_id来插入图表时,它工作得很好。如下所示:

代码语言:javascript
复制
models.Dashboard.create({ 
    user_id: 1,
    title: 'Visites Histopad'
}).then((dashboard) => {
    models.Chart.bulkCreate([{
        dashboard_id: dashboard.id,
        title: 'time',
        x_title: 'Days',
        y_title: 'Count',
        data_type: 'count',
        data_value: 'visit',
        filters: '[{"type":"project","values":["1"]},{"type":"language","values":["french"]},{"type":"satisfaction","values":[1,2,3]}]'
      },
      {
        dashboard_id: dashboard.id,
        title: 'indicator',
        x_title: '',
        y_title: '',
        data_type: 'count',
        data_value: 'visit',
        filters: '[{"type":"project","values":["1","2","3","4","5","6"]},{"type":"language","values":["french"]}]'
      }
    ]).then(() => {
      res.send({
        'message': 'Dashboard loaded !'
      });
    });
  });
票数 1
EN

Stack Overflow用户

发布于 2018-06-06 16:55:48

好吧,我想通了..。我使用的是Sequelize的旧版本,因为seuquelize-cli加载的是2.0.0-rc8版本,而不是最后一个版本(4.0.0)。所以现在一切都运行得很完美。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50685266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档