如何允许使用nullable:false的循环关系?

时间:2019-05-26 17:53:03

标签: typeorm

我想存储谁是每个记录的“创建者”和“更新者”,以作为对数据库中“用户”表的引用。这适用于每个表,包括“用户”表本身。这是因为可能会由正在注册的用户或其他一些已经存在的用户创建记录。

在“用户”表上,我有一个数据库触发器,默认情况下将“创建者”和“更新者”字段填充为与新生成的“ id”相同的值,因此我想在其上使用NOT NULL约束我的“创建者”和“更新者”列。不幸的是,这导致以下错误:“检测到循环关系:用户->用户。要解决此问题,您需要在此依赖项结构中的某处设置可空值:false。”

我是否可以使用TypeORM在非空约束条件下建立循环关系?

2 个答案:

答案 0 :(得分:0)

我实际上能够使其工作。如果有人在寻找答案,我将分享我的解决方案。

在尝试通过以下方式自动生成“ created_by”列之前:

@ManyToOne(type => User, { onUpdate: 'CASCADE', onDelete: 'CASCADE', nullable: false })
@JoinColumn({ name: 'created_by' })
creator: User

我要做的就是从那里删除nullable:false并将其移到新的@Column字段中,这样我总共就会拥有:

@Column({ nullable: false })
created_by: number

@ManyToOne(type => User, { onUpdate: 'CASCADE', onDelete: 'CASCADE' })
@JoinColumn({ name: 'created_by' })
creator: User

答案 1 :(得分:0)

我有一个类似的问题。我有一个场景,在同一张表中有外键。 如果我进一步说明我的情况。我当时正在将条件语句存储在应用程序中。

condition#1 a > 4 
condition#2 a + b < 0 

现在,我想让用户能够将逻辑运算符置于黑白condition#1和condition#2中。假设用户以黑白方式选择了OR运算符。 看起来像

(condition#1 OR condition#2)

现在出现了有趣的部分,我觉得需要同时安装FK。如果用户希望在#1和#2之前或之后使用OR运算符添加另一个条件,该怎么办?

condition#3  OR (condition#1 OR condition#2)

因此,为了存储这些条件,我创建了关系。 我为此场景存储了2条记录 第一个用于存储(条件#1或条件#2),第二个记录用于存储 condition#3 OR(condition#1 OR condition#2)

现在我要解决它了。 以前是这样的:

export class ConditionLogicalOperator {

@PrimaryGeneratedColumn({
type: "int",
name: "ConditionLogicalOperatorID"
})    
ConditionLogicalOperatorID: number;

@Column("int", {
nullable: false,
name: "LogicalOperatorID"
})
LogicalOperatorID: number;

@ManyToOne(() => ConditionLogicalOperator, (ConditionLogicalOperator: ConditionLogicalOperator) => ConditionLogicalOperator.conditionLogicalOperators)
@JoinColumn({ name: 'ConditionID1' })
conditionLogicalOperator1: ConditionLogicalOperator | null;

@ManyToOne(() => ConditionLogicalOperator, (ConditionLogicalOperator: ConditionLogicalOperator) => ConditionLogicalOperator.conditionLogicalOperators2)
@JoinColumn({ name: 'ConditionID2' })
conditionLogicalOperator2: ConditionLogicalOperator | null;



....
....

}

技巧是将一个空对象{}添加到Relationship中。请注意每个属性中@ManyToOne行末的{}。它对我有用。

export class ConditionLogicalOperator {

@PrimaryGeneratedColumn({
type: "int",
name: "ConditionLogicalOperatorID"
})
ConditionLogicalOperatorID: number;

@Column("int", {
nullable: false,
name: "LogicalOperatorID"
})
LogicalOperatorID: number;

@ManyToOne(() => ConditionLogicalOperator, (ConditionLogicalOperator: ConditionLogicalOperator) => ConditionLogicalOperator.conditionLogicalOperators, { })
@JoinColumn({ name: 'ConditionID1' })
conditionLogicalOperator1: ConditionLogicalOperator | null;

@ManyToOne(() => ConditionLogicalOperator, (ConditionLogicalOperator: ConditionLogicalOperator) => ConditionLogicalOperator.conditionLogicalOperators2, { })
@JoinColumn({ name: 'ConditionID2' })
conditionLogicalOperator2: ConditionLogicalOperator | null;



....
....

}