🏄‍♂️

【Hasura】親子関係があるテーブルへ1回のmutationで同時にレコード追加してみた

2024/01/21に公開

概要

Hasuraでレコード追加する際に、親子関係があるテーブルを1回のmutationで同時に追加することを試してみました。
内容としてはHasuraのinsertに関するドキュメントのOne-to-one / One-to-many relationshipsに書いてあるものになります。

前提

  • 使用したHasuraのバージョンは2.36.1です。
  • DBはPostgreSQLを使用します。

実装サンプル

テーブル構成としては以下の2テーブルを用意します。
problem_themesが親テーブルで、problem_questionsが子テーブルになります。idはuuidが自動で入るように設定してあります。

CREATE TABLE public.problem_themes (
	id varchar NOT NULL DEFAULT uuid_generate_v4(),
	account_user_id varchar NOT NULL,
	title varchar NOT NULL,
	description varchar NULL,
	create_date_time timestamptz NOT NULL DEFAULT now(),
	CONSTRAINT problem_themes_pkey PRIMARY KEY (id)
);

CREATE TABLE public.problem_questions (
	id varchar NOT NULL DEFAULT uuid_generate_v4(),
	account_user_id varchar NOT NULL,
	theme_id varchar NOT NULL,
	contents varchar NOT NULL,
	create_date_time timestamptz NOT NULL DEFAULT now(),
	CONSTRAINT problem_questions_pkey PRIMARY KEY (id)
);
ALTER TABLE public.problem_questions ADD CONSTRAINT problem_questions_theme_id_fkey FOREIGN KEY (theme_id) REFERENCES public.problem_themes(id) ON DELETE CASCADE ON UPDATE CASCADE;

insertのmutationは以下になります。account_user_idの項目はSetting Values for Fields Using Role-Based Column Presetsのドキュメントになる内容を参考に、X-Hasura-User-Idが入るように設定しておきます。

export const addThemeAndQuestionMutationDocument = gql`
  mutation AddThemeAndQuestion(
    $themeTitle: String!
    $themeDescription: String
    $question: String!
  ) {
    insert_problem_themes_one(
      object: {
        title: $themeTitle
        description: $themeDescription
        problem_questions: { data: { contents: $question } }
      }
    ) {
      id
    }
  }
`;

mutationの結果は以下の通りです。子テーブproblem_questionsのtheme_idに、親のidが自動設定されています。

Discussion