내일배움캠프

230829 supabase inner join을 통해 필요한 데이터 한 번에 가져오기

Neda 2023. 8. 29. 12:50

230829 supabase inner join을 통해 필요한 데이터 한 번에 가져오기

채팅 기능을 구현하기 위해 채팅방 테이블, 채팅방 참가자 테이블, 채팅 메시지 테이블을 각각 만들었다. 일반적으로 채팅 페이지에서는 현재 사용자가 참여중인 채팅방의 목록을 보여주어야 한다. 또한 채팅방 각각의 참여자 수와 마지막 메시지를 미리보기로 보여주어 채팅방 리스트에서도 한 눈에 확인하기 쉽도록 해야 한다.

 

supabase foreign table join 

supabase 에서는 외래키를 통해 연결된 테이블에 대해서 자동으로 join을 지원한다.

이렇게 하면 연결된 데이터를 모두 가져올 수 있다.

await supabase
    .from('chat_rooms')
    .select( `*,chat_room_participants (*)`)
 

Querying Joins and Nested tables | Supabase Docs

_10 const { data, error } = await supabase.from('countries').select(`

supabase.com

 

 

supabase inner join

하지만 때에 따라서 inner join이 필요할 때가 있다. 예를 들어 채팅방 데이터를 모두 가져오지 않고, 사용자가 참여중인 채팅방 데이터와 해당 채팅방의 참여자 목록만을 함께 불러올 때이다.

해당 문법은 버전 9에서 추가되었다. 별도로 알려주는 페이지는 없고 공식 문서의 filter 탭에서 찾을 수 있었다.

왜 이렇게 꽁꽁 숨긴 건지 모르겠지만

inner join을 사용하면 filter를 걸때 하위 테이블의 필터를 기반으로 최상위 테이블의 행을 필터링 가능하다.

때문에 채팅방도 자신이 속한 채팅방만 가져올 수 있다.

(chat_room_participants 테이블의 데이터는 해당 채팅방의 참여자만 읽기가 가능하도록 정책이 미리 설정되어 있다)

await supabase
    .from('chat_rooms')
    .select( `*,chat_room_participants!inner (*)`)

 


 

 

PostgREST 9

New features and updates in PostgREST version 9.

supabase.com

 

Match the filter | Supabase

Match only rows which satisfy the filter. This is an escape hatch - you should use the specific filter methods wherever possible.

supabase.com