从 @ManyToOne() 关系 mikro orm 获取数据 mongodb
Get data from @ManyToOne() relation mikro orm mongodb
我有一个 Post 实体:
export class Post {
@PrimaryKey()
_id!: ObjectId;
@Field(() => ID)
@SerializedPrimaryKey()
id!: string;
@Field(() => String)
@Property()
createdAt: Date = new Date();
@Field(() => String)
@Property({ onUpdate: () => new Date() })
updatedAt: Date = new Date();
@Field(() => String)
@Property()
title!: string;
@Field(() => String)
@Property()
excerpt!: string;
@Field(() => String)
@Property()
content!: string;
@Field(() => User)
@ManyToOne()
author!: User;
}
用户实体:
@ObjectType()
@Entity()
export class User {
@PrimaryKey()
_id!: ObjectId;
@Field(() => ID)
@SerializedPrimaryKey()
id!: string;
@Field(() => String)
@Property()
createdAt = new Date();
@Field(() => String)
@Property({ onUpdate: () => new Date() })
updatedAt = new Date();
@Field(() => String)
@Property()
name!: string;
@Field(() => String)
@Property({ unique: true })
email!: string;
@Property()
password!: string;
@Field(() => [Post], { nullable: true })
@OneToMany(() => Post, (post) => post.author)
posts = new Collection<Post>(this);
}
创建Post函数:
@Mutation(() => Post)
async createPost(
@Arg("post") post: PostInput,
@Ctx() { em, req }: appContext
) {
const newPost = em.create(Post, {
...post,
author: new ObjectId(req.session.sid),
});
await em.persistAndFlush(newPost);
return newPost;
}
如您所见,User 和 Post 分别与一对多关系相关。 user.posts
工作正常,因为我们需要添加 init()
。但是当我尝试记录 post.author
时,它给了我以下信息:
Ref<User> { _id: ObjectId('600663ef9ee88b1b9c63b275') }
我已经搜索了文档,但找不到如何填充作者字段。
要填充关系,您可以使用 wrap
助手:
await wrap(newPost.author).init();
如果实体已经加载,将其标记为已填充就足够了:
await wrap(newPost.author).populated();
(但这里没有加载,你可以通过登录时的Ref<>
来判断,它只存在于未加载的实体)
https://mikro-orm.io/docs/entity-helper/#wrappedentity-and-wrap-helper
如果你想对加载的实体和新持久化的实体有相同的结果,你可以在 ORM 配置中使用 populateAfterFlush: true
。这样,所有关系都将在调用 em.flush()
后填充。但这在这里也无济于事,因为您正在使用未加载的现有实体的 PK(例如,使用 newPost.author = new Author()
时会有帮助)。
顺便说一句,这里不需要使用对象 ID,这应该没问题:
const newPost = em.create(Post, {
...post,
author: req.session.sid,
});
我有一个 Post 实体:
export class Post {
@PrimaryKey()
_id!: ObjectId;
@Field(() => ID)
@SerializedPrimaryKey()
id!: string;
@Field(() => String)
@Property()
createdAt: Date = new Date();
@Field(() => String)
@Property({ onUpdate: () => new Date() })
updatedAt: Date = new Date();
@Field(() => String)
@Property()
title!: string;
@Field(() => String)
@Property()
excerpt!: string;
@Field(() => String)
@Property()
content!: string;
@Field(() => User)
@ManyToOne()
author!: User;
}
用户实体:
@ObjectType()
@Entity()
export class User {
@PrimaryKey()
_id!: ObjectId;
@Field(() => ID)
@SerializedPrimaryKey()
id!: string;
@Field(() => String)
@Property()
createdAt = new Date();
@Field(() => String)
@Property({ onUpdate: () => new Date() })
updatedAt = new Date();
@Field(() => String)
@Property()
name!: string;
@Field(() => String)
@Property({ unique: true })
email!: string;
@Property()
password!: string;
@Field(() => [Post], { nullable: true })
@OneToMany(() => Post, (post) => post.author)
posts = new Collection<Post>(this);
}
创建Post函数:
@Mutation(() => Post)
async createPost(
@Arg("post") post: PostInput,
@Ctx() { em, req }: appContext
) {
const newPost = em.create(Post, {
...post,
author: new ObjectId(req.session.sid),
});
await em.persistAndFlush(newPost);
return newPost;
}
如您所见,User 和 Post 分别与一对多关系相关。 user.posts
工作正常,因为我们需要添加 init()
。但是当我尝试记录 post.author
时,它给了我以下信息:
Ref<User> { _id: ObjectId('600663ef9ee88b1b9c63b275') }
我已经搜索了文档,但找不到如何填充作者字段。
要填充关系,您可以使用 wrap
助手:
await wrap(newPost.author).init();
如果实体已经加载,将其标记为已填充就足够了:
await wrap(newPost.author).populated();
(但这里没有加载,你可以通过登录时的Ref<>
来判断,它只存在于未加载的实体)
https://mikro-orm.io/docs/entity-helper/#wrappedentity-and-wrap-helper
如果你想对加载的实体和新持久化的实体有相同的结果,你可以在 ORM 配置中使用 populateAfterFlush: true
。这样,所有关系都将在调用 em.flush()
后填充。但这在这里也无济于事,因为您正在使用未加载的现有实体的 PK(例如,使用 newPost.author = new Author()
时会有帮助)。
顺便说一句,这里不需要使用对象 ID,这应该没问题:
const newPost = em.create(Post, {
...post,
author: req.session.sid,
});