【问题标题】:How can I join models in ExtJS?如何在 ExtJS 中加入模型?
【发布时间】:2021-04-04 18:18:24
【问题描述】:

在 ExtJS 6.02 中,我想将 2 个或更多模型加入一个商店。

一对一关系:


给定的用户只能与 DB 中的单个用户详细信息行关联:

"users": [
    {
      "id": 1,
      "name": "Philip J. Fry",
      "userDetail": 1
    },
    {
      "id": 2,
      "name": "Hubert Farnsworth",
      "userDetail": 2
    },
    {
      "id": 3,
      "name": "Turanga Leela",
      "userDetail": 3
    },
    {
      "id": 4,
      "name": "Amy Wong",
      "userDetail": 4
    }
]
"usersDetails": [
    {
      "id": 1,
      "email": "jfry@a.com",
      "sex": "m"
    },
    {
      "id": 2,
      "email": "hubert@a.com",
      "sex": "m"
    },
    {
      "id": 3,
      "email": "leela@a.com",
      "sex": "f"
    },
    {
      "id": 4,
      "email": "amy@a.com",
      "sex": "m"
    }
]

我想在商店里有这个:

"users": [
    {
      "id": 1,
      "name": "Philip J. Fry",
      "email": "jfry@a.com",
      "sex": "m"
    },
    {
      "id": 2,
      "name": "Hubert Farnsworth",
      "email": "hubert@a.com",
      "sex": "m"
    },
    {
      "id": 3,
      "name": "Turanga Leela",
      "email": "leela@a.com",
      "sex": "f"
    },
    {
      "id": 4,
      "name": "Amy Wong",
      "email": "amy@a.com",
      "sex": "m"
    }
]

一对多关系:


假设用户可以在 BD 中发布多个帖子:

"users": [
    {
      "id": 1,
      "name": "Philip J. Fry",
      "userDetail": 1
    },
    {
      "id": 2,
      "name": "Hubert Farnsworth",
      "userDetail": 2
    },
    {
      "id": 3,
      "name": "Turanga Leela",
      "userDetail": 3
    },
    {
      "id": 4,
      "name": "Amy Wong",
      "userDetail": 4
    }
]
"posts": [
    {
      "id": 1,
      "user": 1,
      "title": "Post 1 title",
      "body": "Post 1 body"
    },
    {
      "id": 2,
      "user": 1,
      "title": "Post 2 title",
      "body": "Post 2 body"
    },
    {
      "id": 3,
      "user": 2,
      "title": "Post 3 title",
      "body": "Post 3 body"
    },
    {
      "id": 4,
      "user": 3,
      "title": "Post 4 title",
      "body": "Post 4 body"
    }
]

我想要一个包含以下内容的商店:

"items": [
    {
      "id": 1,
      "name": "Philip J. Fry",
      "posts": [
          {
            "id": 1,
            "title": "Post 1 title",
            "body": "Post 1 body"
          },
          {
            "id": 2,
            "title": "Post 2 title",
            "body": "Post 2 body"
          }
      ]
    },
    {
      "id": 2,
      "name": "Hubert Farnsworth",
      "posts": [
          {
            "id": 3,
            "user": 2,
            "title": "Post 3 title",
            "body": "Post 3 body"
          }
      ]
    },
    {
      "id": 3,
      "name": "Turanga Leela",
      "userDetail": 3,
      "posts": [
          {
            "id": 4,
            "user": 3,
            "title": "Post 4 title",
            "body": "Post 4 body"
          }
      ]
    },
    {
      "id": 4,
      "name": "Amy Wong",
      "posts": []
    }
]

多对一关系:


这实际上是我的实际问题,我有一个包含多个项目的数据库表,每个项目只能匹配另一个表中的单个项目。 应该与 1 到多个相同。

多对多关系:


我猜基本上与 1 到多个相同?

我似乎有这个解决方案:https://fiddle.sencha.com/#fiddle/1hs9&view/editor 它并不能涵盖所有内容,也许有更好的选择。

【问题讨论】:

  • 您实际上是否有不同的端点为您提供这些数据,或者更像是您想要使用您可用的不同数据源执行准 SQL 语句?
  • 嗨@incutonez,是的,它们是不同的端点。问题是后端是遗留的,它只能返回一个平面 JSON(一个对象数组),所以没有嵌套项。此外,后端 API 都在 PL/SQL 中,并且有许多其他限制,所以我们的想法是将更多的东西移到前端,看看它是否以这种方式更好地工作。这不是公共 API,我无法分享实际的真实代码。
  • 那么请帮助我们...您目前对解决这个问题有何想法? Ext JS 没有将模型“加入”到一个商店的概念。无论商店的模型是什么,这都是其中所有模型的签名。您将不得不创建某种中间步骤,以按您的意愿处理您的数据。我可能会创建一个 API 端点来将这些信息拼接在一起,但我不知道这是否是您可以做的事情……强迫 UI 完成所有这些都不是一个好主意。
  • @incutonez 我的一个想法是合并模型,例如在模型中添加额外字段或创建连接模型的模型。我不明白的一件事是,由于我已经设置了模型之间的关系,因此我应该能够拥有一个用户,获取他的所有帖子,但只有与用户数据捆绑在一起时才能访问这些帖子在 API 响应中,我找不到任何获取帖子的方法。
  • 好吧,因为您的帖子数据都与其他用户信息混为一谈,因此单独加载它们是没有意义的......而且,当网格加载时,您通常不会进行额外的调用每条记录以获取更多数据...您的端点通常会返回网格所需的所有数据。如果您提前知道所有端点,您可以将它们全部调用,将数据拼接在一起并将其提供给您的网格存储,或者像我说的那样,创建一个 API 端点来为您执行此操作,并将数据返回你需要的方式。

标签: json database join extjs model


【解决方案1】:

根据 Sencha 支持:

ExtJS 中并不真正存在连接记录的概念,但 您可以通过使用渲染器访问和打印记录 关联数据。

我对你上面的例子做了一个简单的调整,向你展示了你可以如何 实现这一点。请注意,关联的动态加载(其中 你在你的例子中)使用渲染器有点棘手,但不是 不可能,因为关联信息的加载是异步的 自然和渲染器不能等待响应。周围的工作 就是在所有关联存储都有的时候刷新整个网格 加载完毕。

https://fiddle.sencha.com/#fiddle/3d1v&view/editor

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多