Pesquisa de site

javascript - relação do TypeORM com um campo além do id


Eu queria criar uma relação de um-para-muitos no TypeORM com um campo diferente de id, a relação usual se parece com isso, mas no mesmo exemplo, digamos, por exemplo, que a coluna name da tabela User também fosse única, agora eu quero referenciar isso na relação, de forma que a chave estrangeira em photos contenha o valor de name e dar a ela um nome de coluna diferente na tabela Photos em vez de userId, por exemplo userName, como exatamente eu faria isso, estou travado e, francamente, não faço a menor ideia de como proceder.

Resposta #1

Para referência futura

Se você quiser que sua relação aponte para uma coluna diferente de id, você deve adicionar referencedColumnName: '<nome da coluna aqui>' às opções do seu @JoinColumn().

ex.:

@Entity()
export class Photo {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    url: string;

    @ManyToOne(() => User, user => user.photos)
    @JoinColumn({ name: 'userName', referencedColumnName: 'name' })
    user: User;

}

Além disso, tenha cuidado ao especificar o referencedColumnName do ponto de vista do typeORM, e não o nome real da coluna do driver subjacente. Por exemplo, se você quiser referenciar uma coluna chamada user_name, mas a propriedade da sua entidade usa camelCase userName, você deve especificar:

referencedColumnName: 'userName'

se você especificar o nome da coluna do banco de dados em vez disso, você receberá erros reclamando que o typeORM não pôde encontrar a coluna referenciada na definição da sua entidade.

Resposta #2

@Entity()
export class Photo {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    url: string;

    @ManyToOne(() => User, user => user.photos)
    @JoinColumn({ name: 'userName' }) // < -- add this line
    user: User;

}


@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @OneToMany(() => Photo, photo => photo.user)
    photos: Photo[];
}

Artigos relacionados