【问题标题】:Get data from @ManyToOne() relation mikro orm mongodb从@ManyToOne() 关系 mikro orm mongodb 获取数据
【发布时间】:2021-04-23 16:40:55
【问题描述】:

我有一个 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);
}

创建帖子功能:

 @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') }

我搜索了文档,但找不到如何填充作者字段。

【问题讨论】:

    标签: node.js mongodb mikro-orm


    【解决方案1】:

    要填充关系,您可以使用 wrap 帮助器:

    await wrap(newPost.author).init();
    

    如果实体已经加载,将其标记为已填充就足够了:

    await wrap(newPost.author).populated();
    

    (但这里没有加载,你可以在登录时通过Ref&lt;&gt;来判断,它只存在于未加载的实体)

    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,
        });
    

    【讨论】:

    • 感谢您提供此解决方案! wrap 函数就像一个魅力。另外,感谢您阐明 ObjectId 的用法。
    猜你喜欢
    • 2021-08-27
    • 2021-08-02
    • 2021-11-16
    • 2021-04-23
    • 1970-01-01
    • 2021-02-09
    • 2022-11-01
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多