HeapTableRepo.createOrUpdateBy

Позволяет атомарно создать запись с заданным уникальным ключом либо изменить её, если запись с таким значением ключа уже существует. Общую логику можно описать так:

  • Если в таблице нет ни одной записи с заданным значением ключа - создаётся новая запись с заданными значенями полей и заполнением значений полей по умолчанию (как в create).

  • Если в таблице присутствует запись с заданным значением ключа и она единственная - значения полей этой записи обновляются в соответствие с переданным объектом (как в update).

  • Если в таблице присутствует несколько записей с заданным значением ключа - бросается соответствующая ошибка, изменений не происходит. Значения переданных полей валидируются на сооветствие схеме таблицы.

Значения переданных полей валидируются на сооветствие схеме таблицы.

Использование метода createOrUpdateBy гарантирует, что в таблице не будет создано дублирующих записей по выбранному ключу. Однако, следует понимать, что гарантия действует только в случае, если для создания записей этой таблицы используется только createOrUpdateBy и никогда не используется create.

Применение/сигнатура

table.createOrUpdateBy(ctx, uniqFieldName, fields)

Аргументы

  • ctx*: app.Ctx
    Контекст запроса. Используется для внутренней реализации, сохранении информации о пользователе, изменившем запись, а также позволяет выполнить запрос в нужной транзакции.
  • uniqFieldName: string
    Название поля верхнего уровня из схемы таблицы, значение которого используется в качестве уникального ключа для данной операции. Поле должно иметь тип, поддерживающий фильтрацию по точному значению (см. руководство по языку запросов).
  • fields: { [uniqFieldName], ... }
    Объект с полями и из значениями, соответствующими схеме таблицы. В объекте должно быть определено значение поля, соответствующего uniqFieldName — , а также все "обязательные" поля, объявленные в схеме heap-таблицы: все кроме Optional, Nullable и NonRequired, как и в create.

Возвращаемое значение: Promise<HeapObject>

Только что созданный либо изменённый heap-объект.

Примеры


Создание уникальной записи с допольнительной информацией по текущему пользователю. В обоих вызовах createOrUpdateBy происходит работа с одной и той же записью.

const UserInfos = Heap.Table('userInfos', {
  userId: Heap.RefLink('users'),
  occupation: Heap.Optional(Heap.String()),
  religion: Heap.Optional(Heap.String()),
})

const info1 = await UserInfos.createOrUpdateBy(ctx, 'userId', {
  userId: ctx.user.id,
  occupation: 'Software Developer',
})
const info2 = await UserInfos.createOrUpdateBy(ctx, 'userId', {
  userId: ctx.user.id,
  religion: 'Agnostic',
})
// info1.id === info2.id

❤️ Made with love on Chatium

ООО "Чатиум"

Информация о компании