【问题标题】:Sequelize : One-to-Many relationship not working when inserting valuesSequelize:插入值时一对多关系不起作用
【发布时间】:2018-11-14 01:34:24
【问题描述】:

我得到了两个对象之间的一对多关系:仪表板和图表,描述如下:

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;
};

还有:

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;
};

所以当我想添加一个带有多个图表的新仪表板时:

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),但我不明白这种有问题的行为......

感谢您的帮助和启发!

【问题讨论】:

    标签: node.js orm sequelize.js one-to-many sequelize-cli


    【解决方案1】:

    在定义的关联中

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

    foreignKey 被称为dashboard_id,但Chart 模型中没有dashboard_id

    以下代码有效

    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);
    });
    

    【讨论】:

      【解决方案2】:

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

      按照你的方式,我仍然遇到同样的问题......我不明白为什么,也许是因为我使用 Sequelize CLI,每个对象定义一个 JS 文件......或者 Sequelize 同步函数没有被调用正确的时刻。

      奇怪的是,当我先插入仪表板,然后通过定义它们的dashboard_id 来插入图表时,它工作得很好。像这样:

      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 !'
            });
          });
        });
      

      【讨论】:

        【解决方案3】:

        好的,我想通了...我使用的是旧版本的 Sequelize,因为 seuquelize-cli 加载的是 2.0.0-rc8 版本,而不是最后一个 (4.0.0)。所以现在一切正常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-07
          • 2021-05-10
          • 2014-05-11
          • 2020-03-14
          • 2017-02-12
          相关资源
          最近更新 更多