我在连接查询上使用Sequelize。目前,连接表中的数据以对象数组的形式呈现。客户端需要一个字符串数组。
这是可以/应该用Sequelize做的事情吗?在将数据发送给客户端之前,我是否需要手动转换数据?
查询
movie.findOne({
include: [
{
model: db.genre,
attributes: ['name'],
through: {
attributes: [],
},
},
})
输出{
"id": 52,
"type": "movie",
"Genres": [
{
"name": "Action"
},
{
"name": "Comedy"
}
]
}
理想情况下,我希望流派格式为:
"Genres": ["Action", "Comedy"]
不技术上纯sequelize是可能的。但是,在查询之后格式化对象是微不足道的。
ob.Genres = ob.Genres.map(x=>x.name);
// { id: 52, type: 'movie', Genres: [ 'Action', 'Comedy' ] }
您还可以技术上使用序列化文字将您需要的内容组合在一起作为单独的属性-但它比必要的更复杂。
movie.findOne({
where:{
id:52
},
attributes: [
'id','type',
[Sequelize.literal(`
(
SELECT GROUP_CONCAT(name)
FROM Genres
WHERE
movieId = 52
)`), 'Genres'],
]
})
对你的数据库做一些假设,但这就是我的想法。您可以对查询结果中的所有名称进行GROUP_CONCAT,并将它们放入新属性中。
我建议在查询后手动映射值。
您可以使用Sequelize提供的pluck方法来获得相同的结果。pluck方法允许您指定要从数组中的每个对象提取的属性,并返回这些值的数组。
const response = movie.findOne({
include: [
{
model: db.genre,
attributes: ['name'],
through: {
attributes: [],
},
},
});
const stringsArray = response.map(object => object.property);
console.log(stringsArray);