Как получить доступ к транзакции текущего контекста при расширении класса QueryBuilder в Knex - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь расширить QueryBuilder Knex.js.Я хочу изменить метод delete(), чтобы удалить дочерние элементы моей модели Objection.js.Текущий код работает хорошо, но я хочу поддерживать транзакции в новом методе:

class CustomQueryBuilder extends QueryBuilder {
  // Override delete method
  delete() {
    return super.select('*').first().runAfter(async (old, builder) => {
      // Some extra logic here, being able to access old entry
      return await old.query().nativeDelete() // original delete
    })
  }

  nativeDelete() {
    return super.delete()
  }
}

Где находится транзакция текущего контекста?Это доступно?

Примечание: я не могу передать его как параметр в delete(trx) функции, так как delete() можно вызывать из других методов, не передавая его явно как параметр

1 Ответ

0 голосов
/ 22 апреля 2019

Текущая транзакция QueryBuilder доступна через builder.context():

class CustomQueryBuilder extends QueryBuilder {
  // Override delete method
  delete() {
    return super.select('*').eager('reference').runAfter(async (olds, builder) => {
      return await Promise.all(olds.map(old => old.$query(builder.context().transaction).mergeContext(builder.context()).nativeDelete()))
    })
  }

  nativeDelete() {
    return super.delete()
  }
}
...