🏄♂️
【Hasura】親子関係があるテーブルへ1回のmutationで同時にレコード追加してみた
概要
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