【Supabase×Next.js】JavaScriptクライアントを使用して親テーブルと子テーブルを同時挿入する方法

Supabase と Next.js を使用して、親テーブルにデータを挿入する際に、子テーブルにも同時にデータを挿入する方法を紹介します。

基本設定

まずは以下のように Supabase クライアントを設定します。

import { createClient } from '@supabase/supabase-js';

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL;
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;

export const supabase = createClient(supabaseUrl, supabaseAnonKey);

Supabase の設定

Supabase プロジェクトを作成し、必要なテーブルを設定します。

例えば、orders テーブルが親テーブルであり、order_items テーブルが子テーブルであると仮定します。それぞれのテーブル定義は以下のようになります。

orders テーブル

カラム名データ型説明
id (主キー)整数注文の一意の識別子
customer_nameテキスト顧客の名前

order_items テーブル

カラム名データ型説明
id (主キー)整数注文明細の一意の識別子
order_id外部キー注文を参照するための orders テーブルの主キー
product_nameテキスト商品の名前
quantity整数商品の数量

親テーブルと子テーブルへのデータ挿入処理

親テーブルと子テーブルに同時にデータを挿入する関数を作成します。この関数では、まず親テーブルにデータを挿入し、その後子テーブルにデータを挿入します。

import { supabase } from "../lib/supabaseClient";

export async function createOrder(order, items) {
  // 親テーブルへの挿入
  const { data, error } = await supabase
    .from("orders")
    .insert([{ customer_name: order.customer_name }])
    .select();

  if (error) {
    throw error;
  }
  if (!data[0].id) {
    throw new Error('Failed to insert record');
  }
  // 子テーブルへの挿入
  const orderItems = items.map(item => ({
    order_id: data[0].id,
    product_name: item.product_name,
    quantity: item.quantity
  }));

  const { error: orderItemsError } = await supabase
    .from("order_items")
    .insert(orderItems);

  if (orderItemsError) {
    throw orderItemsError;
  }
}

この createOrder 関数では、まず ordersテーブルにデータを挿入し、その後order_itemsテーブルにデータを挿入しています。親テーブルのデータ挿入が成功した場合、そのレコードの ID を使って子テーブルのデータを挿入します。これで、親テーブルと子テーブルへのデータ挿入処理ができるかと思います。

コメントを残す

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。