问题描述
我想要做的是从 Db 获取详细信息,当我得到响应时,属性名称不应与 Db 相同,因此我使用的是 for 循环。当我尝试安慰它时,我得到了所需的响应,但我得到了空数组/数据库的最后一个数据。谁能帮帮我?
// ------display all customer group---->
const displayCustomerGroup = async (req,res,next) =>{
var results = await Group.findAll();
var newData ={};
var data = {};
for(var i = 0; i < results.length ; i++){
for(const [key,value] of Object.entries(results[i].dataValues)){
newData[key.replace("cg_","")] = value;
}
console.log(newData)
}
res.json({
status:"success",message:"Successfully",data:newData
})
}
解决方法
当您使用 Sequelize 模型时,您可以将选项传递给 findAll()
方法。您正在寻找的选项是 attributes
选项。这使您可以选择要返回的列 - 类似于 SQL 中的 SELECT 语句。 Attributes
应该是与列名匹配的字符串数组。
例如:
await Group.findAll({
attributes: ["Id","Name","CreateDate"]
})
如果需要,您还可以通过传递数组数组来重命名列,其中每个数组的第一个是列的名称,第二个是列的新名称:
await Group.findAll({
attributes: [["cg_id","Id"],["cg_name","Name"],["cg_date","CreateDate"]]
})
在 SQL 中,这基本上是这样的:
SELECT cg_id AS Id,cg_Name AS Name,cg_date AS CreateDate
FROM Group
,
看起来你有两个循环:你有很多结果(你在外循环中迭代),每个结果都有一组许多键值对(你在内循环中迭代)。内部循环将键值对复制到 newData
中,但如果下一个结果具有相同的键名,它们将覆盖前一个结果的数据。
相反,您需要使用对象数组,并在外循环中逐项填充该列表:
var dataList =[];
for(var i = 0; i < results.length ; i++){
let dataItem = {};
for(const [key,value] of Object.entries(results[i].dataValues)){
dataItem[key.replace("cg_","")] = value;
}
dataList.push(dataItem);
}
res.json({
status:"success",message:"Successfully",data: dataList
})