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

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

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

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

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

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

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

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

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

Но это бросает:

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

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

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

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

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 - это первичный ключ в таблице моста, состоящий из двух идентификаторов.


person kbcool    schedule 29.05.2020    source источник
comment
ИМХО, это описано в предоставленных вами документах - вам необходимо предоставить все вложенные данные (категорию, прочтите ее ранее) и использовать on_conflict   -  person xadm    schedule 29.05.2020
comment
@xadm, значит, вы пытаетесь вставить дубликат вложенных данных, а on_conflict вместо этого обрабатывает обновление? Я пробовал, но пока не смог заставить его себя вести. В основном такая же ошибка возникает при попытке его использования. `` on_conflict: {ограничение: product_pkey, update_columns: [id]} `` `   -  person kbcool    schedule 29.05.2020
comment
Я не использую его, я читал эти документы, и, IMHO, он должен работать таким образом ... поиск по проблемам и, в конечном итоге, открытие одного с минимальным примером - похоже, обратное отношение не работает?   -  person xadm    schedule 29.05.2020
comment
Можете ли вы опубликовать структуру ваших таблиц? Трудно понять, в чем проблема, не зная структуры.   -  person Leonardo Alves    schedule 30.05.2020
comment
@LeonardoAlves добавил несколько скриншотов структуры и обновления от Хасуры на основе того, что добавил xadm.   -  person kbcool    schedule 31.05.2020


Ответы (1)


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

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

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

person Leonardo Alves    schedule 02.06.2020
comment
Спасибо! Это работает! Я также могу понять, почему это работает. Теперь, когда я видел, как это работает. Имя отношения - это категория, но, по сути, это представление таблицы мостов. Не сразу интуитивно понятно, но теперь я понимаю. - person kbcool; 03.06.2020