Как построить мутацию вставки "многие ко многим" в Hasura?

Я создаю свою первую вставную мутацию «многие ко многим» в Hasura и нахожу это трудным. Синтаксис в документах И сопутствующему объяснению очень трудно уследить.

Я просто пытаюсь добавить связь между component и module.

Вот состояние моего текущего запроса.

mutation MyMutation {
  insert_component(objects: {component_module: {data: {module: {data: {id: "775c9e27-c974-4cfa-a01f-af50bd742726"}, on_conflict: {constraint: module_id_key, update_columns: id}}}}}) {
    affected_rows
    returning {
      id
      component_modules
    }
  }
}

Вот ошибка, которую я получаю.

{
  "errors": [
    {
      "extensions": {
        "path": "$.selectionSet.insert_component.args.objects[0].component_module.data",
        "code": "constraint-violation"
      },
      "message": "Not-NULL violation. null value in column \"component_id\" violates not-null constraint"
    }
  ]
}

Заранее спасибо за помощь.


person oaksprout    schedule 20.05.2020    source источник


Ответы (1)


Ваша мутация не работает, потому что вы вставляете идентификатор вручную, и когда Хасура генерирует запрос, у него не будет идентификатора в родительском элементе.

При выполнении вложенных вставок лучше всего позволить PostgreSQL генерировать идентификаторы за вас. Таким образом, вы сможете вставить любую сторону отношения.

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

Например:

component - id - created_at - updated_at - name module - id - created_at - updated_at - name component_module - component_id - module_id

И мутация должна быть примерно такой:

mutation {
  insert_component(objects: {
    name:"component name",
    component_modules: {
      data: {
        module: {
          data: {
            name: "module name"
          }
        }
      }
    }
  }) {
    returning {
      id
      component_modules {
        component {
          name
        }
      }
    }
  }
}
person Leonardo Alves    schedule 20.05.2020
comment
Спасибо за помощь! Удаление component_modules и module_components в таблицах компонентов и модулей помогло. Похоже, я неверно истолковал документы. - person oaksprout; 21.05.2020
comment
Могу я спросить, почему это имя компонента, а не имя модуля? module: {data: {name: component name}} Спасибо - person oaksprout; 21.05.2020