Как получить полную обновленную запись в хуке $afterUpdate в моделях возражений?

Я использую Objection.js в качестве моего ORM для простого приложения осадков. Мне нужно иметь возможность динамически обновлять и вводить одну таблицу при обновлении таблиц более низкого уровня. Для этого мне нужна вся запись, которую я обновляю, чтобы я мог использовать эти данные для корректного обновления динамически обновляемой записи.

Я использую $afterUpdate крюк для записи таблицы нижнего уровня, который. У меня проблема в том, что когда я вхожу this в пределах $afterUpdate Подключаемая функция содержит только те части записи, которые я хочу обновить. Как я могу получить всю запись? Я уверен, что смогу получить запись, выполнив дополнительный запрос к БД, но я надеялся, что этого не будет. Любая помощь будет оценена

1 ответ

Решение

Я думаю, что сейчас вы можете получить всю модель только с дополнительным запросом. Если вы выполняете обновление с помощью запроса экземпляра ($query), вы можете получить другие свойства из options.old,

Запрос:

const user = await User.query().findById(userId);
await user.$query()
          .patch({ name: 'Tom Jane' })

Крючок:

$afterUpdate(opt, queryContext) {
  console.log(opt.old)
}

заплата

Если вам не нужно делать это в хуке, вы можете использовать patch функция связана с first().returning('*') чтобы получить всю модель в одном запросе, это более эффективно, чем patchAndFetchById в postgreSQL. Как указано в документации.

Поскольку PostgreSQL (и некоторые другие) поддерживают возврат цепочки ('*'), вы можете вставить строку или обновить / исправить / удалить существующие строки и получить затронутые строки в качестве экземпляров модели в один запрос, что повышает эффективность. Смотрите примеры для большей ясности.

const jennifer = await Person
  .query()
  .patch({firstName: 'Jenn', lastName: 'Lawrence'})
  .where('id', 1234)
  .returning('*')
  .first();

Рекомендации:

Другие вопросы по тегам