Logo花火漫画开发文档
RPC 函数详情

关联作品获取

通过 comic_relations 关联表进行双向两跳查询,返回与指定漫画相关的所有作品

概述

get_related_comics 基于 comic_relations 关联表,查找与目标漫画存在关系的所有作品。采用两跳(2-hop)图遍历:先找直接关联的漫画,再找这些漫画关联的漫画,合并去重后返回。

属性
语言SQL
稳定性STABLE(只读,无副作用)
返回类型SETOF comics(完整漫画行)

参数

Prop

Type

关联表结构

comic_relations 是一张双向关联表,每行表示两部漫画之间的关系:

字段类型说明
source_comic_idbigint关系的一端
target_comic_idbigint关系的另一端

关系是双向的:查询时同时检查 source_comic_idtarget_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 自身
  1. direct_neighbors:在 comic_relations 中查找所有包含 p_comic_id 的行,提取对端 ID
  2. two_hop_neighbors:对第一跳的结果再做一次相同的关联查询,找到间接关联的漫画
  3. all_neighbors:UNION 合并两跳结果(自动去重),最后排除 p_comic_id 自身

UNION 自带去重能力,同一部漫画即使同时出现在一跳和二跳结果中也只返回一次。

返回字段

返回 SETOF comics,即 comics 表的完整行结构,包含 idtitlecover_urlposter_urlrating_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。

On this page