shimotsu tech

Webフロントエンドエンジニア @ to-R inc.

Supabase のDBからデータを取得する際、ネストされた子レコードの order を指定する

Supabase のDBからデータを取得する際に、ネストされた子レコードの order を指定する方法でちょっと躓いたのでメモがてら書いておきます。

前提

まず、前提として以下の posts テーブルと items テーブルがあると仮定します。ここで、items テーブルの post_id カラムは posts テーブルの id に関連づけられています。

posts:
  id: string
  title: string
  is_published: boolean
  created_at: Timestamp
  updated_at: Timestamp
  description: string

items:
  id: string(uuid)
  created_at: Timestamp
  updated_at: Timestamp
  post_id: string(uuid) // 外部キー
  order_number: number
  body: string

このとき、アプリケーションで posts を取得する際、それに紐づく items を含め、さらに items の順序を order_number によって並び替えたいとします。

方法

以下のように書きます。

const { data: post, error } = await supabase
    .from("posts")
    .select(
      '*, items(*)'
    )
    .eq('id', id)
    .order('order_number', { foreignTable: 'items', ascending: true }) // 昇順 でソート
    .single()

.order('order_number', { foreignTable: 'items', ascending: true }) のように、order メソッドの第二引数に、外部テーブル名とソート方法を指定してやればよさそうです。

参考リンク

supabase.com

github.com