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\".

你做错了两件事

  1. 在您的 json 架构中将您的列定义为 state_id: {type: ['integer', 'null']}
  2. 在您的用户迁移中进行 table.integer('state_id').unsigned().nullable()