Хасура: Как установить связь sh с существующей записью (многие ко многим) во время вставки? - PullRequest
0 голосов
/ 29 мая 2020

Хасура: Как установить связь sh с существующей записью (многие ко многим) во время вставки?

У меня есть две таблицы: продукт и категория, которые связаны друг с другом отношениями многие ко многим на основе столбца id в каждой таблице и промежуточной таблицы product_category.

Я могу вставлять записи непосредственно в postgres для обеих таблиц и связывать их с product_category, и это отлично работает в Hasura для запросов, поэтому я знаю, что у меня есть настроить все правильно.

Что я хочу сделать, так это вставить новый продукт и зная идентификатор категории (или категорий), я хочу установить sh связь во время вставки. Желательно без отдельного вызова

https://hasura.io/docs/1.0/graphql/manual/mutations/insert.html#insert -an-object-with-its-related-objects-through-Relations

В документации рассматривается только вставка обоих объект и связанные объекты одновременно, но что, если другой уже существует?

Я пробовал то, что я ожидал бы работать (привязка этого продукта к категории с идентификатором 1):

mutation MyMutation {
  insert_product_one(
    object: {
      name: "Champion", 
      category: {data: {id: 1}}
    }) {
    id
  }
}

Но это вызывает:

«Нарушение Not-NULL. Значение null в столбце \" product_id \ "нарушает ограничение not-null»

Как я могу вставить этот новый продукт и связать его в одну или несколько категорий? Желательно все в одном операторе, но даже пример получения сгенерированного идентификатора и мутации обновления не был бы идеальным, но, тем не менее, решение.

Обновление: в качестве проверки работоспособности я воссоздал продукт и таблицы категорий в качестве минимального, базового c примера и попробовал как мой запрос, так и метод конфликта upsert, предложенный xadm.

Данные и отношения, которые я добавил здесь:

https://imgur.com/a/GUomMbe

mutation MyMutation {
  insert_testproduct_one(
    object: {
      name: "Champion", 
      category: {
          data: {id: 1},
          on_conflict: { constraint: primarykeything , update_columns: [id] }
    }
    }) {
    id
  }
}

Ошибка аналогична: «Нарушение Not-NULL. Значение null в столбце \" testcategory_id \ "нарушает ограничение not-NULL»

Примечание: primarykeything - это первичный ключ в таблице моста, состоящий из двух идентификаторов.

1 Ответ

1 голос
/ 02 июня 2020

Так как это отношения "многие ко многим", между ними есть таблица соединений. Из того, что я вижу на скриншоте, вы разместили идентификатор категории в вашей категории, отношение называется testcategory_id, а не id.

mutation MyMutation {
  insert_testproduct_one(
    object: {
      name: "Champion", 
      category: {
          data: {testcategory_id: 1}
    }
    }) {
    id
  }
}

Чтобы он работал, идентификатор в таблице testproduct_testcategory имеет для автоматического увеличения

...