在计算字段的 PostgreSQL 函数中使用 Hasura session

Using Hasura session in PostgreSQL function for computed field

我创建了一个 "favorite" 功能,它类似于许多网站中常见的 "Like" 功能。

有3个table:

对应的SQL为:

CREATE TABLE public."user" (
    id uuid DEFAULT public.gen_random_uuid() NOT NULL
);
CREATE TABLE public."photo" (
    id uuid DEFAULT public.gen_random_uuid() NOT NULL
);
CREATE TABLE public."favorite" (
    userId uuid NOT NULL
    photoId uuid NOT NULL
);

现在,我想查询带有计算字段 isFavorite 的照片作为布尔值,当当前用户收藏照片时,该值设置为 true。

所以,我创建了这个自定义 SQL 函数:

CREATE OR REPLACE FUNCTION public.isfavorite(photo photo, hasura_session json)
 RETURNS boolean
 LANGUAGE sql
 STABLE
AS $function$
SELECT EXISTS (
    SELECT *
    FROM public.favorite
    WHERE "userId" = (VALUES (hasura_session ->> 'x-hasura-role'))::uuid AND "photoId" = photo.uuid
)
$function$

我可以在 Hasura 中使用 SQL 创建此函数,但是当我将此函数设置为照片 table 中的计算字段时,Hasura 显示此错误:

in table "photo": in computed field "isFavorite": function "isfavorite" is overloaded. Overloaded functions are not supported

我哪里弄错了?我们可以构建一个 return 布尔值的自定义函数吗?您如何构建最喜欢(或喜欢)的功能?

已解决:数据库中有两个 isFavorite 函数导致过载...

现在照片架构中有一个 isFavorite 字段,但我需要提供 $argshasura_session 作为参数。 如何提供hasura_session而不需要填写参数?

您需要跟踪传递会话变量的计算列。
https://hasura.io/docs/1.0/graphql/manual/api-reference/schema-metadata-api/computed-field.html

{
    "type":"add_computed_field",
    "args":{
        "table":{
            "name":"photo",
            "schema":"public"
        },
        "name":"isfavorite",
        "definition":{
            "function":{
                "name":"isfavorite",
                "schema":"public"
            },
            "table_argument":"photo_row",
            "session_argument": "hasura_session"
        }
    }
}

这也是最近添加的。确保您使用的是 v1.3 或更高版本。我还将更改函数以接受 photo_row 作为变量,而不是 photo photo 这可能会导致 PostgreSQL 出现问题。

CREATE OR REPLACE FUNCTION public.isfavorite(photo_row photo, hasura_session json)
 RETURNS boolean
 LANGUAGE sql
 STABLE
AS $function$
SELECT EXISTS (
    SELECT *
    FROM public.favorite
    WHERE "userId" = (VALUES (hasura_session ->> 'x-hasura-role'))::uuid AND "photoId" = photo.uuid
)
$function$