GraphQL 实战:如何处理多表联合查询

阅读时长 12 分钟读完

在前端开发领域中,GraphQL 作为一种新型的数据查询语言,已经成为越来越多开发者的选择。它不仅能够优化传统的 RESTful API,还能让前端开发者更加高效地与后端工程师沟通和协作。然而,在实际项目中,多表联合查询是一种常见的需求,这时候如何使用 GraphQL 处理这类问题呢?本篇文章将会分享如何在实战中使用 GraphQL,处理多表联合查询。

1. 多表联合查询的背景

在实际项目中,有可能会出现一个需求:查询一个商品的详情,并且该商品相关的评论、评分、标签等信息也需要查询出来。如果使用传统的 RESTful API,可能需要发出多次请求,而每次请求的返回数据都存在不同的字段中,这样不仅浪费带宽,还需要在前端进行数据的整合和处理,这增加了开发者的工作量。而在 GraphQL 中,使用多表联合查询可以将这些信息一次性地查询到,并把所有需要的数据整合到一个对象中,这让整个查询过程变得更加高效和方便。

2. 如何处理多表联合查询

在 GraphQL 中,要处理多表联合查询,首先需要了解 GraphQL 中的 schema、type、resolver 的概念。其中,schema 是 GraphQL 中的 API 契约,它定义了每一个可用的字段和类型;type 是 schema 中声明的一个数据类型,它告诉 GraphQL 一个查询可以返回哪些字段数据;resolver 是用来在 schema 中定义的字段被访问时,GraphQL 如何返回数据的函数。

下面,我们将具体介绍如何定义 type 和 resolver,来实现多表联合查询。假设我们需要查询一个商品及它的评论、评分、标签等信息,在 GraphQL 中的 schema 可以定义如下:

-- -------------------- ---- -------
---- ------- -
  --- ---
  ----- ------
  --------- -----------
  -------- ----------
  ----- -------
-

---- ------- -
  --- ---
  ---------- ---
  ----- ------
-

---- ------ -
  --- ---
  ---------- ---
  ------ ---
-

---- --- -
  --- ---
  ----- ------
  ---------- ---
-

---- ----- -
  -------------- ----- -------
-

在 schema 中,我们定义了四个 type,分别是 Product、Comment、Rating 和 Tag。其中,Product 的 comments、ratings 和 tags 字段都是数组类型,用来存放商品相关的评论、评分和标签数据。

接下来,我们需要定义 resolver,来告诉 GraphQL 如何查询和返回数据。在 GraphQL 中,为每个类型定义一个 resolver 函数:

-- -------------------- ---- -------
----- --------- - -
  ------ -
    ----------- ----- -------- - -- -- - ----------- -- -- -
      ----- ------- - ----- ---------------------------------

      ----- -------- - ----- ----------------------------------

      ----- ------- - ----- ---------------------------------

      ----- ---- - ----- ------------------------------

      ------ -
        -----------
        ---------
        --------
        -----
      --
    -
  --

  -------- -
    --- -- -- -- -- ---
    ----- -- ---- -- -- -----
    --------- -- -------- -- -- ---------
    -------- -- ------- -- -- --------
    ----- -- ---- -- -- -----
  --

  -------- -
    --- -- -- -- -- ---
    ---------- -- --------- -- -- ----------
    ----- -- ---- -- -- -----
  --

  ------- -
    --- -- -- -- -- ---
    ---------- -- --------- -- -- ----------
    ------ -- ----- -- -- ------
  --

  ---- -
    --- -- -- -- -- ---
    ----- -- ---- -- -- -----
    ---------- -- --------- -- -- ----------
  --
--

在 resolver 中,我们定义了返回数据的方式。首先,定义了 Query 类型的 getProduct 方法,用来查询商品的详细信息。在 getProduct 方法中,我们通过调用数据源的 API 来获取商品相关的评论、评分和标签数据,并将这些数据整合到一个对象中返回出去。

然后,我们定义了 Product 类型的 resolver,用来返回一个商品的相关信息,包括商品的 id、name、comments、ratings 和 tags 信息。对于 Comment、Rating 和 Tag 类型的 resolver 也是类似的处理方式。

最后,我们需要配置 Apollo server,来搭建一个 GraphQL 服务器,并将定义的 type 和 resolver 与服务器关联起来。这里不再赘述,感兴趣的读者可以参考官方文档:https://www.apollographql.com/docs/apollo-server/getting-started/

3. 示例代码

在实际使用 GraphQL 中,如何处理多表联合查询?下面提供一份完整的示例代码,以供大家参考。首先,我们需要定义一个数据源的 API:

-- -------------------- ---- -------
----- -------- - --
  --- ----
  ----- -----------
-- -
  --- ----
  ----- -----------
---

----- -------- - --
  --- ----
  ---------- ----
  ----- ----- ---------
-- -
  --- ----
  ---------- ----
  ----- ----- ---------
-- -
  --- ----
  ---------- ----
  ----- ---- ---------
---

----- ------- - --
  --- ----
  ---------- ----
  ------ --
-- -
  --- ----
  ---------- ----
  ------ --
-- -
  --- ----
  ---------- ----
  ------ --
---

----- ---- - --
  --- ----
  ----- -------
  ---------- ----
-- -
  --- ----
  ----- -------
  ---------- ----
-- -
  --- ----
  ----- -------
  ---------- ----
---

----- ----- -
  ----- -------------- -
    ------ --------------------- -- ---------- --- ----
  -

  ----- ---------------------- -
    ------ ----------------------- -- ----------------- --- -----------
  -

  ----- --------------------- -
    ------ --------------------- -- ---------------- --- -----------
  -

  ----- ------------------ -
    ------ --------------- -- ------------- --- -----------
  -
-

然后,我们定义一个 Apollo server,并将 type 和 resolver 与服务器关联起来:

-- -------------------- ---- -------
----- - ------------- --- - - -------------------------
----- ----- - -------------------

----- -------- - ----
  ---- ------- -
    --- ---
    ----- ------
    --------- -----------
    -------- ----------
    ----- -------
  -

  ---- ------- -
    --- ---
    ---------- ---
    ----- ------
  -

  ---- ------ -
    --- ---
    ---------- ---
    ------ ---
  -

  ---- --- -
    --- ---
    ----- ------
    ---------- ---
  -

  ---- ----- -
    -------------- ----- -------
  -
--

----- --------- - -
  ------ -
    ----------- ----- -------- - -- -- - ----------- -- -- -
      ----- ------- - ----- ---------------------------------

      ----- -------- - ----- ----------------------------------

      ----- ------- - ----- ---------------------------------

      ----- ---- - ----- ------------------------------

      ------ -
        -----------
        ---------
        --------
        -----
      --
    -
  --

  -------- -
    --- -- -- -- -- ---
    ----- -- ---- -- -- -----
    --------- -- -------- -- -- ---------
    -------- -- ------- -- -- --------
    ----- -- ---- -- -- -----
  --

  -------- -
    --- -- -- -- -- ---
    ---------- -- --------- -- -- ----------
    ----- -- ---- -- -- -----
  --

  ------- -
    --- -- -- -- -- ---
    ---------- -- --------- -- -- ----------
    ------ -- ----- -- -- ------
  --

  ---- -
    --- -- -- -- -- ---
    ----- -- ---- -- -- -----
    ---------- -- --------- -- -- ----------
  --
--

----- ------ - --- --------------
  ---------
  ----------
  ------------ -- -- --
    ------ --- --------
  ---
---

--------------------------- --- -- -- -
  --------------- ------ ----- -- ---------
---

最后,在命令行中启动 server,并利用 GraphiQL 工具测试一下:

打开浏览器,输入 http://localhost:4000/graphql,进入 GraphiQL 工具。在编辑框中输入以下查询语句:

-- -------------------- ---- -------
----- ---------- -
  -------------- ---- -
    --
    ----
    -------- -
      --
      ----
    -
    ------- -
      --
      -----
    -
    ---- -
      --
      ----
    -
  -
-

点击运行按钮,可以看到如下结果:

-- -------------------- ---- -------
-
  ------- -
    ------------- -
      ----- ----
      ------- -----------
      ----------- -
        -
          ----- ----
          ------- ----- --------
        --
        -
          ----- ----
          ------- ----- --------
        -
      --
      ---------- -
        -
          ----- ----
          -------- -
        --
        -
          ----- ----
          -------- -
        -
      --
      ------- -
        -
          ----- ----
          ------- ------
        --
        -
          ----- ----
          ------- ------
        -
      -
    -
  -
-

至此,我们成功地使用 GraphQL 处理了一个多表联合查询,并得到了想要的查询结果。

4. 总结

本文介绍了如何使用 GraphQL 处理多表联合查询,包括如何定义 type 和 resolver,并提供了一个示例代码。在实际项目中,多表联合查询是一个常见的需求,而 GraphQL 正是为如此之类的需求而生的。它可以极大地简化前后端开发者之间的协作和沟通,提升开发效率和体验。希望本文可以对大家理解 GraphQL 有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a7a2b648841e989441f84d

纠错
反馈