Sequelize 如何支持多语言 ORM

前言

ORM(Object-Relational Mapping)是一种对数据库进行操作的思想,它将对象和数据库映射起来,通过操作对象来操作数据库。而 Sequelize 是一个 Node.js 的 ORM 框架,它将对象和 MySQL、PostgreSQL、SQLite、MS SQL Server 等数据库映射起来。在多语言的应用程序中,需要 ORM 框架支持多语言,才能更方便地进行国际化处理。Sequelize 如何支持多语言 ORM 呢?

多语言 ORM 思路

在多语言应用程序中,需要在数据库中存储多语言文本信息。一般情况下,需要创建一个表来存储多语言信息,这个表需要包含多个字段,每个字段对应一种语言,然后在程序中根据当前语言选取对应的字段。比如下面的示例:

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

上面的示例中,product 表包含 id、name_en、name_cn 和 name_jp 四个字段,分别存储英文、中文和日文的商品名称。在程序中,可以根据当前语言选择对应的字段进行展示。

使用 Sequelize 支持多语言 ORM,需要新增一个 Model 层并继承原来的 Model,增加支持多语言的字段。代码如下:

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

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

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

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

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

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

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

上面的代码中,继承了 Sequelize 的 Model 类,并重写了 init 方法和一些实用方法。init 方法用来初始化 Model,它会循环属性列表,为支持多语言的属性新增字段。支持的语言列表通过 options.langs 在定义 Model 时进行传递。fieldName 方法用来获取指定语言的字段名,setFieldValues 和 fieldValues 用来设置和获取指定语言的字段值。findWithLang 方法用来获取带语言信息的查询结果。

Sequelize 多语言 ORM 示例

在使用 Sequelize 支持多语言 ORM 时,需要继承前面的 TranslateModel 并定义新的 Model,定义时需要指定支持的语言列表。下面是一个示例代码:

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

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

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

上面的代码中,Product 继承了 TranslateModel 并定义了新的 Model,定义时指定了支持的语言列表。

在程序中使用例子:

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

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

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

上面的例子中,首先定义了一个 Product Model,然后创建了一条记录,记录中指定了英文和中文名称。接着调用了 findWithLang 方法查询记录,查询时指定了语言为英文。查询结果只包含了英文名称,中文名称被忽略掉了。

总结

本篇文章介绍了 Sequelize 如何支持多语言 ORM,包括多语言 ORM 的思路、多语言 ORM 示例和相关代码。使用 Sequelize 支持多语言 ORM,可以方便地进行国际化处理,提高应用程序的多语言支持能力。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/664c3757d3423812e4b07bd5