[英]How to configure sequelize to return embedded array in a one-to-many association?
這是交易:
我有兩個模型-用戶和房屋
用戶有很多房子
房屋屬於用戶
我輸入了一些虛擬數據並創建了一個最小的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的默認行為是返回相同User數據的多個實例,每次都帶有不同的內部數據,如下所示:
[
{
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
}
]
我可以在擁有的用戶中嵌入一系列房屋嗎?
有沒有一種方法可以將Sequelize配置為返回數據,如下所示:
[
{
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;
};
我有一個類似的問題,只是找到了一種適合我的解決方案:
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,現在是具有其關聯數組的對象!
嘗試將'as'選項添加到User-> House 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);
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.