Почему у меня нет ссылочного идентификатора объекта? - PullRequest
1 голос
/ 23 апреля 2020

У меня есть два простых объекта в TypeORM с One To One соединениями. Если я сделаю запрос POST, я получу таблицы, но ссылка ID останется null. Почему это так?

Основной пользовательский объект:

@Entity({ name: "user" })
export class User extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ unique: true })
  username: string;

  @Column()
  password: string;

  @OneToOne(
    (type) => Personal,
    (personal) => personal.user,
    { cascade: true }
  )
  @JoinColumn()
  personalId: personal;
}

Личное лицо:

@Entity({ name: "personal" })
export class Personal {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ nullable: true })
  familyName: string;

  @Column({ nullable: true })
  additionalName: string;

  @OneToOne(
    (type) => User,
    (user) => user.personalId
  )
  user: User;
}

ОБНОВЛЕНИЕ:

I попытался установить eager: true но ничего не изменилось. Я попытался установить nullable: false и удалил существующую базу данных, но потом, когда я попробовал POST, ничто не обрадовало.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Вы указали cascade: true в своем декораторе OneToOne, что означает, что когда вы сохраняете пользователя с данным человеком, он также будет сохранен. Когда вы загружаете пользователя, вы должны указать, что данные для человека должны быть объединены. В противном случае сущность человека будет сохранена, не будет загружена при получении пользователя. В вашем случае это можно сделать, установив для eager значение true:

  @OneToOne(
    (type) => Personal,
    (personal) => personal.user,
    { cascade: true, eager: true }
  )
  @JoinColumn()
  personalId: personal;

Если вы хотите использовать построитель запросов, это будет работать:

const queryBuilder = entityManager.createQueryBuilder(User, 'user');
queryBuilder.leftJoinAndSelect('user.person', 'person');
return queryBuilder.getMany();
1 голос
/ 27 апреля 2020

Если вы хотите загрузить идентификатор или работать только с идентификатором (т.е. установить отношение без загрузки целевой сущности), просто объявите столбец идентификатора отношения следующим образом:

  @OneToOne(
    (type) => Personal,
    (personal) => personal.user,
    { cascade: true, eager: true }
  )
  personal!: Personal;

  @Column('int')
  personalId!: personal;

если вы чтобы он мог быть обнуляемым, просто используйте @Column('int', { nullable: true }).

TypeORM распознает столбец, так как он имеет то же имя и не будет дублировать команды схемы, в то время как вы можете напрямую использовать ID отношения.

...