TypeORM: как реализовать двунаправленную связь, несколько полей -> один тип сущности - PullRequest
0 голосов
/ 25 июня 2019

Я создал объект «документ»:

например,

@Entity()
export class Document {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  path: string;
   ...

}

Несколько документов могут быть связаны с различными типами объектов: post, userProfile и т. Д.

inНапример, у объекта post есть несколько полей, которые все определяют отношения документа.

  @OneToOne(type => DocumentEntity)
  @JoinColumn({ name: 'default_document' })
  defaultDocument: DocumentEntity;

  @OneToOne(type => DocumentEntity)
  @JoinColumn({ name: 'featured_document' })
  featuredDocument: DocumentEntity;

  @OneToMany(type => DocumentEntity, document => document.post)
  @JoinColumn({ name: 'other_documents' })
  otherDocs: DocumentEntity[]; 

Мне неясно, как сделать отношения документа двунаправленными.Я надеялся иметь одно поле в документе, например:

  @ManyToOne(type => abstractEntity, entity => entity.document)
  parentEntity: abstractEntity;

Таким образом, если я запрашиваю сущности документа для их родительских отношений, у меня будет такой результат:

documents: [
{
id: 1,
name: 'document 1', 
path: 'https://image.hosted.service/1.jpg', 
parentEntityId: 23
}, 
{
id: 2
name: 'document 2', 
path: 'https://image.hosted.service/2.jpg'
parentEntityId: 27
}
] 

Но Typeorm, кажется, хочет, чтобы я определил точное поле соответствия для каждого родительского поля отношения в documentEntity, например:

@Entity()
export class Document {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  path: string;
  ...

  @OneToOne(type => PostEntity, post => post.defaultDocument)
  postEntityDefaultDoc: PostEntity;

  @OneToOne(type => PostEntity, post => post.featuredDocument)
  postEntityFeaturedDoc: PostEntity;

  @ManyToOne(type => PostEntity, post => post.otherDocs)
  otherDocs: PostEntity[];


}

Для простоты в этом примере не существует отношений M: N: документ можетиметь не более одного родителя.

Неправильно, что мне придется определять новое поле в сущности документа для каждого возможного случая, когда поле родительской сущности ссылается на документ.Запрос к документу не вернет список с одним полем, определяющим родительский объект, вместо этого мне придется проанализировать / агрегировать произвольное количество полей.

Я не могу найти какие-либо учебные пособия / примеры, в которыходна сущность имеет много полей, каждое из которых ссылается на одну и ту же другую сущность, что заставляет меня думать, что мой базовый подход несовершенен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...