如何使用 Sequelize ORM `include` 同一模型的两个单独引用?
How to `include` two separate references of same model using Sequelize ORM?
我正在使用 MEAN 堆栈构建网站,但将 MongoDB 替换为 PostGRES,因此使用 Sequelize ORM。
我有两个模型 -- User
和 AudioConfig
。一个 User
可以有多个 AudioConfig
并且一个 AudioConfig
属于 User
由 createdBy
和 updatedBy
.
这是我的协会使用 Sequelize 的样子
models.User.hasMany(models.AudioConfig, {
foreignKey: {
name: 'createdBy',
allowNull: false
}
});
models.User.hasMany(models.AudioConfig, {
foreignKey: {
name: 'updatedBy'
}
});
models.AudioConfig.belongsTo(models.User, {
foreignKey: {
name: 'createdBy',
as: 'createdBy',
allowNull: false
}
});
models.AudioConfig.belongsTo(models.User, {
foreignKey: {
name: 'updatedBy',
as: 'updatedBy'
}
});
在我对 AudioConfig
的 findAll
查询中,我尝试了几种我在网上找到的变体,但 none 似乎如我所料:
var Db = require('../../models');
var entityModel = Db.AudioConfig;
exports.index = function (req, res) {
entityModel.findAll({
include: {all:true}
})
.then(function (entities) {
return res.status(200).json(entities);
})
.catch(function (err) {
return handleError(res, err);
})
};
// And I've tried this...
exports.index = function (req, res) {
entityModel.findAll({
include: [
{model: Db.User, as: 'createdBy'},
{model: Db.User, as: 'updatedBy'}
]
})
.then(function (entities) {
return res.status(200).json(entities);
})
.catch(function (err) {
return handleError(res, err);
})
};
// And this too...
exports.index = function (req, res) {
entityModel.findAll({
include: [
{
model: Db.User
}
]
})
.then(function (entities) {
return res.status(200).json(entities);
})
.catch(function (err) {
return handleError(res, err);
})
};
现在,在我的数据库中,我有一条 AudioConfig
的记录,它有两个不同的 User
引用 -- 一个用于 createdBy
,另一个用于 updatedBy
。但是当我查询 AudioConfig
时,我只得到 updatedBy
字段的 User
记录。
[
{
"id": "e3011e31-b907-47ad-99f3-61016283a523",
"sampleRate": 16000,
"format": "WAV",
"channel": 2,
"bitRate": 16,
"createdAt": "2016-05-01T16:30:11.847Z",
"updatedAt": "2016-05-01T16:30:11.847Z",
"createdBy": "1375263f-a3f0-4eef-800f-99b28fdce9d8",
"updatedBy": "5bb8cac0-b916-4000-81fe-9b1f8f597847",
"User": {
"id": "5bb8cac0-b916-4000-81fe-9b1f8f597847",
"email": "johnd@email.com",
"firstName": "John",
"lastName": "Doe",
"resetPasswordToken": null,
"resetPasswordTokenExpiresOn": null,
"createdAt": "2016-05-01T16:30:11.816Z",
"updatedAt": "2016-05-01T16:30:11.816Z",
"roleId": "10ae3879-9f9f-4370-aa47-3677c492afd8"
}
}
]
如何获取它以便将 UUID 的 createdBy
值替换为与其关联的 User
对象? updatedBy
字段也一样吗?
相同的行为
我终于明白问题出在哪里了,你在外键对象上设置了 as 属性。这应该有望解决它,不幸的是我现在不能自己测试。
models.User.hasMany(models.AudioConfig, {
as: 'createdByUser',
foreignKey: {
name: 'createdBy',
allowNull: false
}
});
models.User.hasMany(models.AudioConfig, {
as: 'updatedByUser',
foreignKey: {
name: 'updatedBy'
}
});
models.AudioConfig.belongsTo(models.User, {
as: 'createdByUser',
foreignKey: {
name: 'createdBy',
allowNull: false
}
});
models.AudioConfig.belongsTo(models.User, {
as: 'updatedByUser'
foreignKey: {
name: 'updatedBy'
}
});
我正在使用 MEAN 堆栈构建网站,但将 MongoDB 替换为 PostGRES,因此使用 Sequelize ORM。
我有两个模型 -- User
和 AudioConfig
。一个 User
可以有多个 AudioConfig
并且一个 AudioConfig
属于 User
由 createdBy
和 updatedBy
.
这是我的协会使用 Sequelize 的样子
models.User.hasMany(models.AudioConfig, {
foreignKey: {
name: 'createdBy',
allowNull: false
}
});
models.User.hasMany(models.AudioConfig, {
foreignKey: {
name: 'updatedBy'
}
});
models.AudioConfig.belongsTo(models.User, {
foreignKey: {
name: 'createdBy',
as: 'createdBy',
allowNull: false
}
});
models.AudioConfig.belongsTo(models.User, {
foreignKey: {
name: 'updatedBy',
as: 'updatedBy'
}
});
在我对 AudioConfig
的 findAll
查询中,我尝试了几种我在网上找到的变体,但 none 似乎如我所料:
var Db = require('../../models');
var entityModel = Db.AudioConfig;
exports.index = function (req, res) {
entityModel.findAll({
include: {all:true}
})
.then(function (entities) {
return res.status(200).json(entities);
})
.catch(function (err) {
return handleError(res, err);
})
};
// And I've tried this...
exports.index = function (req, res) {
entityModel.findAll({
include: [
{model: Db.User, as: 'createdBy'},
{model: Db.User, as: 'updatedBy'}
]
})
.then(function (entities) {
return res.status(200).json(entities);
})
.catch(function (err) {
return handleError(res, err);
})
};
// And this too...
exports.index = function (req, res) {
entityModel.findAll({
include: [
{
model: Db.User
}
]
})
.then(function (entities) {
return res.status(200).json(entities);
})
.catch(function (err) {
return handleError(res, err);
})
};
现在,在我的数据库中,我有一条 AudioConfig
的记录,它有两个不同的 User
引用 -- 一个用于 createdBy
,另一个用于 updatedBy
。但是当我查询 AudioConfig
时,我只得到 updatedBy
字段的 User
记录。
[
{
"id": "e3011e31-b907-47ad-99f3-61016283a523",
"sampleRate": 16000,
"format": "WAV",
"channel": 2,
"bitRate": 16,
"createdAt": "2016-05-01T16:30:11.847Z",
"updatedAt": "2016-05-01T16:30:11.847Z",
"createdBy": "1375263f-a3f0-4eef-800f-99b28fdce9d8",
"updatedBy": "5bb8cac0-b916-4000-81fe-9b1f8f597847",
"User": {
"id": "5bb8cac0-b916-4000-81fe-9b1f8f597847",
"email": "johnd@email.com",
"firstName": "John",
"lastName": "Doe",
"resetPasswordToken": null,
"resetPasswordTokenExpiresOn": null,
"createdAt": "2016-05-01T16:30:11.816Z",
"updatedAt": "2016-05-01T16:30:11.816Z",
"roleId": "10ae3879-9f9f-4370-aa47-3677c492afd8"
}
}
]
如何获取它以便将 UUID 的 createdBy
值替换为与其关联的 User
对象? updatedBy
字段也一样吗?
我终于明白问题出在哪里了,你在外键对象上设置了 as 属性。这应该有望解决它,不幸的是我现在不能自己测试。
models.User.hasMany(models.AudioConfig, {
as: 'createdByUser',
foreignKey: {
name: 'createdBy',
allowNull: false
}
});
models.User.hasMany(models.AudioConfig, {
as: 'updatedByUser',
foreignKey: {
name: 'updatedBy'
}
});
models.AudioConfig.belongsTo(models.User, {
as: 'createdByUser',
foreignKey: {
name: 'createdBy',
allowNull: false
}
});
models.AudioConfig.belongsTo(models.User, {
as: 'updatedByUser'
foreignKey: {
name: 'updatedBy'
}
});