TypeORM почему мой столбец отношений не определен? внешний ключ не определен

#foreign-keys #typeorm #typeorm-datamapper

#внешние ключи #typeorm #typeorm-datamapper

Вопрос:

Я просто использую TypeORM и нахожу, что столбец отношений не определен

 
@Entity({name: 'person'})
export class Person {
    @PrimaryGeneratedColumn('uuid')
    id!: string;

    @OneToOne( () => User)
    @JoinColumn()
    user!: User;

    @Column({
        type: "enum",
        enum: PersonTitle,
        default: PersonTitle.Blank
        })
    title?: string;

    @Column({type: 'varchar', default: ''})
    first_name!: string;

    @Column('varchar')
    last_name!: string;

    @ManyToOne(() => Organization, org => org.people, { nullable: true})
    belong_organization!: Organization;
  

и у меня также есть Organization сущность:

 export class Organization {
    @PrimaryGeneratedColumn('uuid')
    id!: string;
...
}

  

когда я использую Repository , как:

  const db = await getDatabaseConnection()
 const prep = db.getRepository<Person>('person')
 presult = await prep.findOne({where: {id}})
 console.log(result)
  

мой результат:

 Person {
  id: '75c37eb9-1d88-4d0c-a927-1f9e3d909aef',
  user: undefined,
  title: 'Mr.',
  first_name: 'ss',
  last_name: 'ls',
  belong_organization: undefined,  // I just want to know why is undefined? even I can find in database the column
  expertise: [],
  introduction: 'input introduction',
  COVID_19: false,
  contact: undefined
}
  

таблица базы данных, подобная:

 "id"    "title" "first_name"    "last_name" "expertise" "COVID_19"  "userId"    "belongOrganizationId"  "introduction"
"75c37eb9-1d88-4d0c-a927-1f9e3d909aef"  "Mr."   "test"  "tester"    "nothing"   "0" "be426167-f471-4092-80dc-7aef67f13bac"  "8fc50c9e-b598-483e-a00b-1d401c1b3d61"  "input introduction"
  

Я хочу показать идентификатор организации, как TypeORM это делает? Внешний ключ присутствует не определено?

Ответ №1:

Вам нужно либо отложить загрузку отношения, либо указать отношение в поиске

Ленивый:

 @Entity({name: 'person'})
class Person {
    ...
    @ManyToOne(() => Organization, org => org.people, { nullable: true})
    belong_organization!: Organization;
    ...
}

...

async logOrganization() {
    const db = await getDatabaseConnection()
    const prep = db.getRepository<Person>('person')
    presult = await prep.findOne({where: {id}})
    console.log(await result.belong_organization)
}
  

Найти

 const prep = db.getRepository<Person>('person')
presult = await prep.findOne({
    where: { id },
    relations: ["belong_organization"]
})
  

Вы также всегда могли бы выполнять быструю загрузку, но я бы не советовал этого делать, поскольку тогда он всегда выполнял бы соединение при извлечении человека.

Если вы хотите запросить belong_organizationId , вам нужно добавить его поле в person объект. Обычно это поле выглядит примерно так belongOrganizationId

Это сделало бы

 @Entity({name: 'person'})
class Person {
    ...
    @Column()
    belongOrganizationId:number

    @ManyToOne(() => Organization, org => org.people, { nullable: true})
    belong_organization!: Organization;
    ...
}
  

Это позволило бы также запросить его идентификатор.

Вы также могли бы запросить его более напрямую, но это оставляет вас с довольно уродливым и недостижимым кодом:

 const findOptions: {
    where :{
        id,
        'belong_organization.id': belong_organizationId
    }
}
  

Комментарии:

1. если я хочу выбрать belong_organization.id = «111», как это сделать?

2. @user504909 Здесь одно из многих обсуждений вашего вопроса о том, как select belong_organization.id ="111" , надеюсь, они скоро исправят это должным образом, но, похоже, сейчас вам нужно использовать { belong_organization.id: belong_id, id }

3. @user504909 Я обновил последнюю часть awnser, чтобы сделать ее доступной для чтения человеком