Supabase-js嵌套查询:关联Voting、Result与Club表数据获取
Supabase嵌套查询实现关联表数据获取
Supabase完全支持嵌套查询(nested selects),和Prisma的includes逻辑类似,只需基于PostgreSQL的外键关联,通过supabase-js的select方法即可实现多层关联数据的获取。
前提:确保外键关系已建立
首先需要在三张表间正确设置外键约束,Supabase依赖外键识别表关联:
- Voting表的
result_id→ 关联Result表的id - Result表的
club_id→ 关联Club表的id
你可以在Supabase控制台的「表编辑器」中添加外键,或通过SQL语句创建:
-- 给Voting表添加外键 ALTER TABLE "Voting" ADD CONSTRAINT "Voting_result_id_fkey" FOREIGN KEY ("result_id") REFERENCES "Result"("id"); -- 给Result表添加外键 ALTER TABLE "Result" ADD CONSTRAINT "Result_club_id_fkey" FOREIGN KEY ("club_id") REFERENCES "Club"("id");
实现嵌套查询
1. 获取Voting+关联的Result数据
通过在select中嵌套关联表的字段,即可一次性获取关联数据:
const { data: votings, error } = await supabase .from('Voting') .select(` id, title, -- 通过外键result_id关联Result表,取别名Result(可选,便于识别) Result:result_id ( id, yes, no ) `); // 处理结果 if (error) console.error('查询失败:', error); else console.log('带Result的Voting数据:', votings);
2. 获取Voting+Result+Club的多层嵌套数据
继续嵌套Club表的字段,实现三层关联数据获取:
const { data: votings, error } = await supabase .from('Voting') .select(` id, title, Result:result_id ( id, yes, no, -- 通过外键club_id关联Club表 Club:club_id ( id, name ) ) `); // 返回的数据结构示例: // [ // { // "id": 1, // "title": "Voting title 1", // "Result": { // "id": 1, // "yes": 300, // "no": 406, // "Club": { "id": 1, "name": "Club A" } // } // } // ]
3. 带筛选条件的嵌套查询
如果需要过滤特定数据(比如只获取Club A的投票),可以直接在查询中添加条件:
const { data: votings, error } = await supabase .from('Voting') .select(` id, title, Result:result_id ( id, yes, no, Club:club_id ( id, name ) ) `) .eq('Result.Club.name', 'Club A');
关键说明
- 别名(如
Result:result_id)是可选的,若外键字段名与关联表名逻辑对应,也可直接写result_id(...),但使用别名能让返回的数据结构更清晰。 - 所有嵌套查询本质是PostgreSQL的JOIN操作,Supabase通过语法糖简化了写法,性能与原生JOIN一致。
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

