带有HasMany的sequelize/sequelize-typescript - findAll返回对象而不是数组。
Sequelize是一个基于Node.js的ORM(对象关系映射)库,它提供了对关系型数据库的操作和管理。Sequelize-Typescript是Sequelize的一个扩展,它允许使用TypeScript语言来定义模型和进行数据库操作。
在Sequelize中,HasMany是一种关联关系,用于表示一个模型与多个其他模型之间的一对多关系。当使用findAll方法查询数据时,根据HasMany关联关系的定义,Sequelize会返回一个包含相关对象的数组。
然而,有时候我们希望返回一个包含相关对象的对象,而不是数组。这可以通过在查询时使用include选项来实现。include选项允许我们指定要包含的关联模型,并将其作为属性添加到返回的对象中。
下面是一个示例代码,演示了如何使用include选项来返回包含相关对象的对象:
import { Model, DataTypes, HasMany } from 'sequelize';
import { sequelize } from './sequelize';
class User extends Model {
public id!: number;
public name!: string;
public readonly createdAt!: Date;
public readonly updatedAt!: Date;
public readonly posts?: Post[];
public static associations: {
posts: HasMany<User, Post>;
};
}
class Post extends Model {
public id!: number;
public title!: string;
public readonly createdAt!: Date;
public readonly updatedAt!: Date;
public userId!: number;
}
User.init(
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
},
{
sequelize,
modelName: 'User',
}
);
Post.init(
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
title: {
type: DataTypes.STRING,
allowNull: false,
},
},
{
sequelize,
modelName: 'Post',
}
);
User.hasMany(Post, {
sourceKey: 'id',
foreignKey: 'userId',
as: 'posts',
});
Post.belongsTo(User, {
targetKey: 'id',
foreignKey: 'userId',
});
async function getUserWithPosts(userId: number) {
const user = await User.findOne({
where: { id: userId },
include: [{ model: Post, as: 'posts' }],
});
return user;
}
const userWithPosts = await getUserWithPosts(1);
console.log(userWithPosts);
在上面的示例中,我们定义了两个模型User和Post,它们之间的关系是一对多,即一个用户可以有多个帖子。通过调用getUserWithPosts函数并传入用户ID,我们可以获取包含该用户的所有帖子的对象。
推荐的腾讯云相关产品:腾讯云数据库MySQL、腾讯云云服务器CVM。
腾讯云数据库MySQL:https://cloud.tencent.com/product/cdb
腾讯云云服务器CVM:https://cloud.tencent.com/product/cvm
领取专属 10元无门槛券
手把手带您无忧上云