RPC 函数详情
关联作品获取
通过 comic_relations 关联表进行双向两跳查询,返回与指定漫画相关的所有作品
概述
get_related_comics 基于 comic_relations 关联表,查找与目标漫画存在关系的所有作品。采用两跳(2-hop)图遍历:先找直接关联的漫画,再找这些漫画关联的漫画,合并去重后返回。
| 属性 | 值 |
|---|---|
| 语言 | SQL |
| 稳定性 | STABLE(只读,无副作用) |
| 返回类型 | SETOF comics(完整漫画行) |
参数
Prop
Type
关联表结构
comic_relations 是一张双向关联表,每行表示两部漫画之间的关系:
| 字段 | 类型 | 说明 |
|---|---|---|
source_comic_id | bigint | 关系的一端 |
target_comic_id | bigint | 关系的另一端 |
关系是双向的:查询时同时检查 source_comic_id 和 target_comic_id,无需为同一对关系插入两条记录。
查询逻辑
函数通过三层 CTE 实现两跳图遍历:
目标漫画 A
│
│ 第一跳(direct_neighbors)
▼
B, C, D ← 与 A 直接关联的漫画
│
│ 第二跳(two_hop_neighbors)
▼
E, F, G ← 与 B/C/D 关联的漫画
│
│ 合并去重(all_neighbors)
▼
B, C, D, E, F, G ← UNION 后排除 A 自身direct_neighbors:在comic_relations中查找所有包含p_comic_id的行,提取对端 IDtwo_hop_neighbors:对第一跳的结果再做一次相同的关联查询,找到间接关联的漫画all_neighbors:UNION 合并两跳结果(自动去重),最后排除p_comic_id自身
UNION 自带去重能力,同一部漫画即使同时出现在一跳和二跳结果中也只返回一次。
返回字段
返回 SETOF comics,即 comics 表的完整行结构,包含 id、title、cover_url、poster_url、rating_average 等所有字段。
调用示例
val related = supabase.postgrest
.rpc("get_related_comics") {
parameter("p_comic_id", comicId)
}
.decodeList<ComicDetail>()const { data } = await supabase
.rpc('get_related_comics', {
p_comic_id: comicId,
})使用场景
该函数主要用于漫画详情页的"相关作品"板块,展示与当前漫画同系列、同作者合作、或内容关联的其他作品。两跳设计使得关联关系可以传递——例如漫画 A 关联 B,B 关联 C,则查询 A 时也能发现 C。