1

我在 PostgreSQL 中有这个功能:

CREATE FUNCTION it_exists(
  email text,
  name text
) RETURNS boolean AS $$
DECLARE
  _eva1 boolean;
  _eva2 boolean;
BEGIN
  _eva1 := EXISTS(SELECT * FROM tableA AS A WHERE A.email = $1::citext);
  _eva2 := EXISTS(SELECT * FROM tableB AS A WHERE A.name::citext = $2::citext);
  RETURN _eva1 OR _eva2;
END;
$$ LANGUAGE plpgsql STRICT SECURITY DEFINER;

它被翻译成 Postgraphile,如下所示:

mutation MyMutation($email: String!, $name: String!) {
  itExists(
    input: { email: $email, name: $name }
  ) {
    boolean
  }
}

我想将“布尔”名称更改为“结果”之类的名称,有什么建议吗?考虑我有许多具有不同返回值的函数。

4

2 回答 2

2

我认为 Postgraphile 这样做是为了使其自定义突变遵循Relay 规范,该规范说

按照惯例,突变被命名为动词,它们的输入是在末尾附加“Input”的名称,它们返回一个对象,该名称是附加“Payload”的名称。

因此,您的自定义突变会创建一个ItExistsPayload只有一个字段的类型,而不是返回 GraphQL Boolean。将来您可能希望使用更多字段扩展此有效负载对象。

可以使用@resultFieldName智能标记重命名该字段。在你的情况下:

COMMENT ON FUNCTION it_exists(text, text) IS '@resultFieldName result';
于 2021-09-28T23:48:52.407 回答
1

尝试返回一个表格:

CREATE FUNCTION it_exists(
  email text,
  name text
) RETURNS TABLE (result boolean) AS $$ -- return TABLE type
DECLARE
  _eva1 boolean;
  _eva2 boolean;
BEGIN
  _eva1 := EXISTS(SELECT * FROM tableA AS A WHERE A.email = $1::citext);
  _eva2 := EXISTS(SELECT * FROM tableB AS A WHERE A.name::citext = $2::citext);
  RETURN QUERY SELECT _eva1 OR _eva2; -- modify RETURN to suit TABLE type
END;
$$ LANGUAGE plpgsql STRICT SECURITY DEFINER;
于 2021-09-28T23:48:05.357 回答