Tengo una entidad de publicación:
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; }Entidad usuaria:
@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); }Crear función de publicación:
@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; } Como puede ver, Usuario y Publicación están relacionados con relaciones de uno a muchos, respectivamente. user.posts funciona correctamente, ya que necesitamos agregar init() . Pero cuando traté de iniciar sesión post.author me está dando lo siguiente:
Ref<User> { _id: ObjectId('600663ef9ee88b1b9c63b275') }He buscado en los documentos pero no pude encontrar cómo completar el campo de autor.
Para completar una relación, puede usar el wrap de ajuste:
await wrap(newPost.author).init();Si la entidad ya estuviera cargada, bastaría con marcarla como poblada:
await wrap(newPost.author).populated(); (pero aquí no está cargado, puede saberlo por Ref<> cuando lo registra, está allí solo para entidades no cargadas)
https://mikro-orm.io/docs/entity-helper/#wrappedentity-and-wrap-helper
Si desea obtener el mismo resultado para las entidades cargadas y las entidades persistentes recientemente, puede usar populateAfterFlush: true en la configuración de ORM. De esa forma, todas las relaciones se completarán después de llamar a em.flush() . Pero eso tampoco ayudaría aquí, ya que está trabajando con un PK de una entidad existente que no está cargada (por ejemplo, ayudaría al usar newPost.author = new Author() ).
Por cierto, no debería ser necesario usar la identificación del objeto aquí, esto también debería estar bien:
const newPost = em.create(Post, { ...post, author: req.session.sid, });