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: primary key
- customer_name: text
- order_items テーブル
- id: primary key
- order_id: foreign key (orders テーブルへの参照)
- product_name: text
- quantity: integer
親テーブルと子テーブルへのデータ挿入処理
親テーブルと子テーブルに同時にデータを挿入する関数を作成します。この関数では、まず親テーブルにデータを挿入し、その後子テーブルにデータを挿入します。
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 を使って子テーブルのデータを挿入します。これで、親テーブルと子テーブルへのデータ挿入処理ができるかと思います。