这里是使用sequelizeus 6.x 检索 ForTrade 并连接到 Artwork 和 Viewer 的代码:
let _bid = await ForTrade.findOne({
where: {id:_id},
include:[{
model:Artwork,
include: [{
model:Viewer,
attributes:[["wallet_address", "trader_address"]]
}]
}]
});
console.log("_bid viewer in addressoftrader : ", _bid.artwork.viewer.dataValues.trader_address); //this is the right format to retrieve trader_address
这里是模型的关联:
Artwork.belongsTo(Viewer, {foreignKey: 'uploader_id'});
ForTrade.belongsTo(Artwork, {foreignKey: "artwork_id"});
_bid.artwork.viewer.dataValues.trader_address
可以检索 trader_address
的值,它是一个字符串。但是 _bid.artwork.viewer.trader_address
会产生 undefined
。为什么必须在查看器之后添加 dataValues
才能检索查看器对象?
从 findOne() 查询返回的值不是普通对象,而是一个 Sequelize 实例。
可以使用 Sequelize 方法(例如 set()、increment()、decrement() 和 save())来操作该 Sequelize 实例。非常有用。
正如您所见,您可以访问该对象的 dataValues 属性,但我怀疑这被认为是不安全的。但是,您可以通过调用 .toJSON() 方法或 .get() 方法将此实例转换为普通对象。
稍微切线:这个概念没有立即显现出来的原因之一是,当你使用像 Express 这样的东西时,你可以简单地使用 res.json() 方法,传入 _bid 变量,它就会被发送到客户端作为一个普通的对象。原因是 Express .json() 方法在传递给它的对象上寻找 .toJSON() 方法。因此,它将发送普通对象而不是 Sequelize 实例。
您可以简单地将
raw: true
添加到查询参数中,然后您将获得数据结果而不是模型实例:
const bids = await ForTrade.findOne({
where: {id:_id},
include:[{
model:Artwork,
include: [{
model:Viewer,
attributes:[["wallet_address", "trader_address"]]
}]
}],
raw: true // to get results instead of the model instance
});
受到该答案的启发仅从 Sequelize ORM 获取数据值