Массовое обновление Typeorm — обновление, только если оно существует в теле

#mysql #typescript #backend #typeorm

#mysql #typescript #серверная часть #typeorm

Вопрос:

Предположения

  • Вызывается несколько экземпляров одного объекта Product .

  • Product имеет три свойства, называемые 1) id , 2) name и 3) active .

  • Текущие экземпляры в базе данных выглядят следующим образом:

    [ { id: 1, имя: ‘A’, активный: 0 }, { id:2, имя: ‘B’, активный: 1 }, { id: 3, имя: ‘C’, активный: 0 }, ]

Проблема

Я хотел бы обновить только некоторые свойства нескольких экземпляров по их идентификаторам с помощью запроса, подобного этому:

 Product.update(
  [1,2] , // ids
  {
    name: 'example'
  }
)
  

Я ожидаю чего-то подобного:

 [
  {
    id:1,
    name:'example',
    active: 0
  },
  {
    id:2,
    name:'example',
    active: 1
  },
  {
    id:3,
    name:'C',
    active: 0
  },
]
  

Но этот запрос устанавливает остальные свойства, которые active в этом примере используются по умолчанию! Результат выглядит следующим образом:

 [
  {
    id:1,
    name:'example',
    active: 0
  },
  {
    id:2,
    name:'example',
    active: 0 // which is wrong!
  },
  {
    id:3,
    name:'C',
    active: 0
  },
]
  

Вопросы

  1. Как можно обновлять только существующие свойства в запросе (например, name )?
  2. Как решить эту проблему с помощью save метода using? (Я не могу перейти ids к save методу)

Ответ №1:

Я решил эту проблему с помощью createQueryBuilder :

 await getManager()
  .createQueryBuilder()
  .update(Product)
  .set({
    name: 'example'
  })
  .where('id IN (:ids)', { ids: [1,2] })
  .execute();