异议 js:无法使用 join table extra 属性 更新多对多关系。说额外的 属性 无效

Objection js: Can't update many to many relation with join table extra property. Says additional property is invalid

使用 ObjectionJS over knex over Postgres,我无法在与另一个模型有多对多关系的模型的连接 table 中修补额外的 属性。即使在关注、阅读和重新阅读文档时,我也无法更新 属性。尽管文档列出的内容与我正在做的完全相同。

基本上我有一个等候名单模型,该模型可能有很多用户,在这两个模型之间有一个连接 table,它有一个 "rank" 属性,就像一个索引一个列表。 我正在尝试按照文档

中提供的 $relatedQuery 方法更新此排名 属性

尝试了几种查询方法的组合,静态的和实例的;尝试为每个请求再次获取模型,尝试在两个模型而不是一个模型上添加关系(因为我不需要另一个模型来了解该关系),但无济于事

为了进行比较,这是 ObjectionJS 文档中有关可以找到的额外道具的内容的摘录 here

const linda = await Actor
  .query()
  .findOne({ name: 'Linda Hamilton' });

.
.
.

await linda
  .$relatedQuery('movies')
  .patch({ characterName: 'Florence' })
  .where('movies.name', 'Curvature')

在某处的方法中,我执行以下操作

// At some point above, I do a query().findOne to get the waitlist
// trx is a transaction object
// id is the id of the user I want to update the rank of
        await waitlist
          .$relatedQuery('users', trx)
          .patch({ rank: targetRank })
          .where({ id })

这是一个非常简单的迁移视图

  return knex.schema
    .createTable('users', (table) => {
      table
        .uuid('id')
        .primary()
        .notNullable()
      table.timestamp('createdAt').defaultTo(knex.fn.now())
      table.timestamp('updatedAt').defaultTo(knex.fn.now())
    })
    .createTable('waitlists', (table) => {
      table
        .uuid('id')
        .primary()
        .notNullable()
      table.timestamp('createdAt').defaultTo(knex.fn.now())
      table.timestamp('updatedAt').defaultTo(knex.fn.now())
    })
    .createTable('waitlists_users', (table) => {
      table.uuid('waitlistId')
      table
        .foreign('waitlistId')
        .references('id')
        .inTable('waitlists')
        .onDelete('CASCADE')
      table.uuid('userId')
      table
        .foreign('userId')
        .references('id')
        .inTable('users')
        .onDelete('CASCADE')
      table.primary(['waitlistId', 'userId'])
      table.integer('rank').index()
    })

最后是等候名单模型定义,不向用户提供,因为这对该模型应该是完全透明的,它不关心它的排名变化

  static tableName = 'waitlists'

  static jsonSchema = {
    type: 'object',
    required: [],
    properties: {},
  }

  static get relationMappings() {
    const UserModel = require('where/the/model/is/at').default

    return {
      users: {
        relation: ObjectionModel.ManyToManyRelation,
        modelClass: UserModel,
        join: {
          from: 'waitlists.id',
          through: {
            from: 'waitlists_users.waitlistId',
            to: 'waitlists_users.userId',
            extra: ['rank'],
          },
          to: 'users.id',
        },
      },
    }
  }

执行上面那个小补丁查询会导致这个

ValidationError: rank: is an invalid additional property
      at Function.createValidationError (node_modules/objection/lib/model/Model.js:397:12)
      at parseValidationError (node_modules/objection/lib/model/AjvValidator.js:189:21)
      at AjvValidator.validate (node_modules/objection/lib/model/AjvValidator.js:78:19)
      at validate (node_modules/objection/lib/model/modelValidate.js:35:20)
      at UserModel.$validate (node_modules/objection/lib/model/Model.js:133:12)
      at setJson (node_modules/objection/lib/model/modelSet.js:28:16)
      at UserModel.$setJson (node_modules/objection/lib/model/Model.js:171:12)
      at Function.fromJson (node_modules/objection/lib/model/Model.js:320:11)
      at Function.ensureModel (node_modules/objection/lib/model/Model.js:630:25)
      at ManyToManyUpdateOperation.onAdd (node_modules/objection/lib/queryBuilder/operations/UpdateOperation.js:22:29)
      at ManyToManyUpdateOperation.onAdd (node_modules/objection/lib/relations/manyToMany/update/ManyToManyUpdateOperationBase.js:28:23)
      at QueryBuilder.callOperationMethod (node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:345:33)
      at QueryBuilder.addOperationUsingMethod (node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:381:28)
      at QueryBuilder.addOperation (node_modules/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:372:22)
      at writeOperation (node_modules/objection/lib/queryBuilder/QueryBuilder.js:890:12)
      at writeOperation (node_modules/objection/lib/queryBuilder/QueryBuilder.js:1465:5)

注意:我没有采用原始方法,但这只是最后的手段

编辑:为了澄清,任何看似虚拟的东西都是因为它是,我从 post 中删除了大部分包袱(如模型属性和方法),如果需要这些请告诉我。用户模式和候补名单模式都已完全开发和运行,它们可以干净地用于 crud。我希望能够在给定候补名单、用户和目标排名

的情况下修补加入 table 行

您的 json 架构必须包含 rank 属性,否则您需要允许其他属性或一起删除该虚拟架构。

http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.5.6

  static jsonSchema = {
    type: 'object',
    required: [],
    properties: {},
    additionalProperties: true
  }