TypeORM:如何显式设置ForeignKey而不具有用于加载关系的属性?

时间:2019-03-14 19:48:53

标签: foreign-keys typeorm typescript-decorator

我不想创建一个用于将关系加载到其中的属性(如所有示例所示)。我唯一需要做的就是拥有一个显式外键属性,以便 migration 能够在数据库中为其创建适当的约束。与我需要的装饰器最接近的装饰器是@RelationId,但它仍然需要存在关系类的属性。

为清楚起见,我们以文档中的示例为例:

@Entity()
export class Post {
    @ManyToOne(type => Category)
    category: Category;

    @RelationId((post: Post) => post.category) // it still requires the presence of the `category` proeprty
    categoryId: number;

}

我在这里不需要category属性。我想拥有categoryId属性,并将其标记为Category.Id外键。它应该看起来像这样:

@Entity()
export class Post {

    @ForeignKey((category: Category) => category.Id) // it's a foreign key to Category.Id
    categoryId: number;

}

有可能吗?

5 个答案:

答案 0 :(得分:1)

也许您可以创建和编写自己的迁移并像这样使用它:

--The main CMakeLists.txt is as below:
cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
set(PCAP_LIBRARY /home/rsidhan1/Downloads/libpcap-1.9.1/libpcap.so.1.9.1) // this file was created after building for ARM 

Project(Testing C CXX)

include_directories(/home/rsidhan1/Downloads/libpcap-1.9.1/)

set(PROJECTS eth_read)

foreach(PROJECT ${PROJECTS})
    add_subdirectory(src/${PROJECT})
endforeach()



--The sub CMakeLists.txt is as below:
project(eth_read C CXX)

set(PUBLIC_DOCS
    README.md
)

set(SOURCES
    main.cpp   
)

target_link_libraries(eth_read /home/rsidhan1/Downloads/libpcap-1.9.1/)

该代码段是从orm类型的functional test中提取的,您可以使用它在我认为的数据库上创建自己的约束。

答案 1 :(得分:1)

检查这两个地方Auth module(JwtModule.register())和JWT strategy(super({...}))。确保您将秘密 /secretOrKey 设置为相同的密钥。就我而言,“秘密:process.env.JWT_SECRET_KEY”和“secretOrKey:process.env.JWT_SECRET_KEY”

答案 2 :(得分:0)

“我需要的是拥有显式外键属性” ...

不,您不能。使用@ManyToOne装饰器时,TypeOrm将自动创建外键属性。只需将@ManyToOne和@JoinColumn装饰器组合在一起,就像这样:

@ManyToOne(type => Category)
@JoinColumn({ name: 'custom_field_name_if_you_want' })
category: Category;

答案 3 :(得分:0)

实际上有可能这样做:

@Entity()
export class Post {
    // this will add categoryId
    @ManyToOne(type => Category)
    category: Category;

    // and you can use this for accessing post.categoryId
    // only column you mark with @Column decorator will be mapped to a database column 
    // Ref: https://typeorm.io/#/entities
    categoryId: number;

}

添加的categoryId不会映射到列,然后将用于显式设置id或访问其值,如下所示:

 post.categoryId = 1;
 // or 
 const id = post.categoryId

答案 4 :(得分:0)

我最近遇到了同样的问题。 我仍然使用实体,但仅使用引用实体的主键值。

即我不会在数据库中查询所引用的实体。

假设您的类别实体如下所示:

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

    // ... other stuff
}

现在以您的代码为例。 直接使用外键值分配关系就像这样。

// You wish to assign category #12 to a certain post
post.category = { id: 12 } as Category