Node.js 如何配置sequelize以一对多关联方式返回嵌入式阵列?
交易如下: 我有两种型号-用户和房屋Node.js 如何配置sequelize以一对多关联方式返回嵌入式阵列?,node.js,express,sequelize.js,Node.js,Express,Sequelize.js,交易如下: 我有两种型号-用户和房屋 用户有很多房子 房子属于使用者 我输入了一些虚拟数据,并创建了一个最小的express应用程序来提供api 我想返回一个用户列表,并包括每个用户 api端点如下所示: router.get('/users', function(req, res,next) { models.User.findAll({ include: [ models.House ], raw: true // returns result-set as a
用户有很多房子
房子属于使用者 我输入了一些虚拟数据,并创建了一个最小的express应用程序来提供api
我想返回一个用户列表,并包括每个用户 api端点如下所示:
router.get('/users', function(req, res,next) {
models.User.findAll({
include: [ models.House ],
raw: true // returns result-set as a clean json...
})
.then(function(users) {
d('num users found: ' + users.length);
res.json(users);
})
.catch(function(err){
d('DB ERROR: '+err.message);
next(err);
});
});
Sequelize的默认行为是返回同一用户数据的多个实例,每次使用不同的房屋数据,如下所示:
[
{
id: 1,
first_name: "aa",
last_name: "aaaaaa",
email: "aa@aa.aa",
Houses.id: 1,
Houses.description: "house 1 desc",
Houses.user_id: 1
},
{
id: 1,
first_name: "aa",
last_name: "aaaaaa",
email: "aa@aa.aa",
Houses.id: 3,
Houses.description: "house 3 desc",
Houses.user_id: 1
},
{
id: 2,
first_name: "bb",
last_name: "bbbbbb",
email: "bb@bb.bb",
Houses.id: 2,
Houses.description: "house 2",
Houses.user_id: 2
}
]
[
{
id: 1,
first_name: "aa",
last_name: "aaaaaa",
email: "aa@aa.aa",
Houses:[
{
id: 1,
description: "house 1 desc",
user_id: 1
},
{
id: 3,
description: "house 3 desc",
user_id: 1
},
]
},
{
id: 2,
first_name: "bb",
last_name: "bbbbbb",
email: "bb@bb.bb",
Houses:[
{
id: 2,
description: "house 2",
user_id: 2
}
]
}
]
我可以在拥有的用户中嵌入一组房屋吗?有没有办法将Sequelize配置为返回如下数据:
[
{
id: 1,
first_name: "aa",
last_name: "aaaaaa",
email: "aa@aa.aa",
Houses.id: 1,
Houses.description: "house 1 desc",
Houses.user_id: 1
},
{
id: 1,
first_name: "aa",
last_name: "aaaaaa",
email: "aa@aa.aa",
Houses.id: 3,
Houses.description: "house 3 desc",
Houses.user_id: 1
},
{
id: 2,
first_name: "bb",
last_name: "bbbbbb",
email: "bb@bb.bb",
Houses.id: 2,
Houses.description: "house 2",
Houses.user_id: 2
}
]
[
{
id: 1,
first_name: "aa",
last_name: "aaaaaa",
email: "aa@aa.aa",
Houses:[
{
id: 1,
description: "house 1 desc",
user_id: 1
},
{
id: 3,
description: "house 3 desc",
user_id: 1
},
]
},
{
id: 2,
first_name: "bb",
last_name: "bbbbbb",
email: "bb@bb.bb",
Houses:[
{
id: 2,
description: "house 2",
user_id: 2
}
]
}
]
如果答案是否定的,您能推荐一种将数据解析成这种结构的方法吗
用户模型:
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define('User', {
first_name: DataTypes.STRING,
last_name: DataTypes.STRING,
email: DataTypes.STRING
},
{
classMethods: {
associate: function(models) {
User.hasMany(models.House)
}
}
});
return User;
};
房屋模型:
module.exports = function(sequelize, DataTypes) {
var House = sequelize.define("House", {
description: DataTypes.TEXT
},
{
classMethods: {
associate: function(models) {
House.belongsTo(models.User);
}
}
});
return House;
};
尝试将“as”选项添加到用户->房屋1:n关系中
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define('User', {
first_name: DataTypes.STRING,
last_name: DataTypes.STRING,
email: DataTypes.STRING
},
{
classMethods: {
associate: function(models) {
User.hasMany(models.House, {as: 'houses'})
}
}
});
return User;
};
并相应地更新查询
router.get('/users', function(req, res,next) {
models.User.findAll({
include: [ {model: models.House, as: 'houses'} ],
raw: true // returns result-set as a clean json...
})
.then(function(users) {
d('num users found: ' + users.length);
res.json(users);
})
.catch(function(err){
d('DB ERROR: '+err.message);
next(err);
});
});
我有一个类似的问题,刚刚找到了一个在我的情况下似乎有效的解决方案:
router.get('/users', function(req, res, next) {
models.User.findAll({
include: [ {model: models.House, as: 'houses'} ],
raw: false // returns result-set as sequelize object...
})
.then(function(users) {
users = users.get(); //turns sequelize object into json
d('num users found: ' + users.length);
res.json(users);
})
.catch(function(err){
d('DB ERROR: '+err.message);
next(err);
});
});
将raw设置为false(或默认设置为false),然后,无论何时需要在res.json之前获取原始json,都可以使用users.get()
(“users”现在是sequelize实例),然后可以获取sequelize对象的json,该对象现在是一个具有关联数组的对象
models.User.findAll({
include: [ models.House ],
nest: true
})
将嵌套属性添加到查询中删除原始数据true 有关问题的更多信息
你能发布你的模型文件吗?谢谢@AlessandRoloziobizio!!我刚刚添加了模型,请告诉我是否可以提供任何其他内容。再次感谢@Alessandro Loziobiz Bisi不幸的是,在添加了,{as:'houses}之后,正如您在用户模型和api查询中建议的那样,我收到了以下错误消息-错误:House与用户不关联!这很奇怪,因为它是关联的:(有什么想法吗?这很奇怪!你确定你使用了相同的值吗?因为这是当你在模型中指定一个别名时抛出的错误,你在查询中省略或更改了它…真的很奇怪…我一次又一次地检查它,有一件事我遗漏了,但我仍然得到了—“House(House)”请注意,我还在房屋模型上定义了一个关联-House.belongsTo(models.User)我不知道它是否与此有关…我是否也应该以某种方式修改它?更新-现在它似乎可以正常工作,没有错误…奇怪的是…模型仍然以相同的方式连接,api查询是相同的…可能是某种内部缓存…?在任何情况下-最终的行为并不能解决原始问题-相反返回House.id、House.description等…它返回别名-House.id、House.description等…users.get()显示typeerror。它不是一个函数:(将raw:false改为raw:true似乎可以解决问题,但我没有料到raw选项会出现这种行为。据我所知,该选项应该只从数据库返回纯响应,而不是将对象与所有元数据信息一起续集。)。