objectionjs/knex 是否可以使用可为空的外键?
Are nullable foreign keys possible with objectionjs/knex?
也许这是一个简单的修复,但我似乎无法弄清楚我在这里做错了什么。
我有一个 table 列出了所有州
型号:
static get jsonSchema() {
return {
type: 'object',
properties: {
id: { type: 'integer' },
name: { type: 'string', minLength: 1, maxLength: 100 },
},
}
}
static get relationMappings() {
return {
users: {
relation: Model.HasManyRelation,
modelClass: User,
join: {
from: `${tableNames.state}.id`,
to: `${tableNames.user}.state_id`,
},
},
}
迁移:
await knex.schema.createTable(tableNames.state, (table) => {
table.increments().primary().notNullable()
table.string('name', 100).notNullable()
用户table型号:
static get jsonSchema() {
return {
type: 'object',
properties: {
id: { type: 'integer' },
first_name: { type: 'string', minLength: 1, maxLength: 100 },
last_name: { type: 'string', minLength: 1, maxLength: 100 },
state_id: { type: 'integer', default: null },
},
}
}
static get relationMappings() {
return {
state: {
relation: Model.BelongsToOneRelation,
modelClass: State,
join: {
from: `${tableNames.user}.state_id`,
to: `${tableNames.state}.id`,
},
}
}
}
用户table迁移:
await knex.schema
.createTable(tableNames.user, (table) => {
table.increments().primary().notNullable()
table.string('first_name', 100).notNullable()
table.string('last_name', 100).notNullable()
table.integer('state_id').unsigned()
table
.foreign('state_id')
.references('id')
.inTable(tableNames.state)
.onDelete('SET NULL')
})
现在的问题是:我希望 state_id 列可以为空,因为并非每个用户都会分配给他们一个状态。但是当我尝试插入一个没有 state_id 的用户时,我得到了这个:insert or update on table \"user\" violates foreign key constraint \"user_state_id_foreign\"
.
你做错了两件事
- 在您的 json 架构中将您的列定义为
state_id: {type: ['integer', 'null']}
- 在您的用户迁移中进行
table.integer('state_id').unsigned().nullable()
也许这是一个简单的修复,但我似乎无法弄清楚我在这里做错了什么。
我有一个 table 列出了所有州 型号:
static get jsonSchema() {
return {
type: 'object',
properties: {
id: { type: 'integer' },
name: { type: 'string', minLength: 1, maxLength: 100 },
},
}
}
static get relationMappings() {
return {
users: {
relation: Model.HasManyRelation,
modelClass: User,
join: {
from: `${tableNames.state}.id`,
to: `${tableNames.user}.state_id`,
},
},
}
迁移:
await knex.schema.createTable(tableNames.state, (table) => {
table.increments().primary().notNullable()
table.string('name', 100).notNullable()
用户table型号:
static get jsonSchema() {
return {
type: 'object',
properties: {
id: { type: 'integer' },
first_name: { type: 'string', minLength: 1, maxLength: 100 },
last_name: { type: 'string', minLength: 1, maxLength: 100 },
state_id: { type: 'integer', default: null },
},
}
}
static get relationMappings() {
return {
state: {
relation: Model.BelongsToOneRelation,
modelClass: State,
join: {
from: `${tableNames.user}.state_id`,
to: `${tableNames.state}.id`,
},
}
}
}
用户table迁移:
await knex.schema
.createTable(tableNames.user, (table) => {
table.increments().primary().notNullable()
table.string('first_name', 100).notNullable()
table.string('last_name', 100).notNullable()
table.integer('state_id').unsigned()
table
.foreign('state_id')
.references('id')
.inTable(tableNames.state)
.onDelete('SET NULL')
})
现在的问题是:我希望 state_id 列可以为空,因为并非每个用户都会分配给他们一个状态。但是当我尝试插入一个没有 state_id 的用户时,我得到了这个:insert or update on table \"user\" violates foreign key constraint \"user_state_id_foreign\"
.
你做错了两件事
- 在您的 json 架构中将您的列定义为
state_id: {type: ['integer', 'null']}
- 在您的用户迁移中进行
table.integer('state_id').unsigned().nullable()