Sequelize: отношение «один ко многим» не работает при вставке значений - PullRequest
0 голосов
/ 04 июня 2018

У меня есть отношение "один ко многим" между двумя объектами: приборной панелью и диаграммой, описанные так:

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), но я не понимаю этого проблемного поведения ...

Спасибо за вашу помощь и ваше просвещение!

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Спасибо за вашу помощь, но мне нужна двунаправленная ассоциация «один ко многим».

Поступая так, я все еще сталкивался с той же проблемой ... Я не понимаю, почему, может быть, это потому, что я использую Sequelize CLI с одним файлом JS на определение объекта ... Или функция синхронизации Sequelizeне позвонил в нужный момент.

Странная вещь в том, что когда я сначала вставляю Dashboard, а затем я вставляю диаграммы, определяя их 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 !'
      });
    });
  });
0 голосов
/ 06 июня 2018

Хорошо, я понял ... Я использовал старую версию Sequelize, потому что seuquelize-cli загружает версию 2.0.0-rc8, а не последнюю (4.0.0).Так что теперь все работает отлично.

0 голосов
/ 05 июня 2018

В определенной ассоциации

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