我得到了两个对象之间的一对多关系: Dashboard和Chart,描述如下:
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),但我不理解这种有问题的行为……
感谢您的帮助和启发!
发布于 2018-06-05 08:17:23
在定义的关联中
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);
});
发布于 2018-06-05 17:20:05
谢谢您的帮助,但我需要一个双向的一对多关联。
照你说的做,我还是有同样的问题...我不明白为什么,也许是因为我使用Sequelize CLI,每个对象定义都有一个JS文件……或者没有在正确的时刻调用Sequelize sync函数。
奇怪的是,当我首先插入仪表板,然后通过定义图表的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 !'
});
});
});
发布于 2018-06-06 16:55:48
好吧,我想通了..。我使用的是Sequelize的旧版本,因为seuquelize-cli加载的是2.0.0-rc8版本,而不是最后一个版本(4.0.0)。所以现在一切都运行得很完美。
https://stackoverflow.com/questions/50685266
复制相似问题