使用外键并映射到 EXTJS

Posted

技术标签:

【中文标题】使用外键并映射到 EXTJS【英文标题】:Using foreign Keys and mapping to EXTJS 【发布时间】:2015-07-18 15:11:02 【问题描述】:

我正在使用基于 mongo 的 DB 模式,其中有 ReferenceFields (ObjectIds) 列表。

所以假设我有两个模型:用户、组

用户对象:


"_id" : ObjectId("554ba2897fdd66239457fb33"),
"name" : "something"

组对象:


"_id" : ObjectId("453490sdkjskldfjlskdjf"),
"name" : "group_name",
users : [ ObjectId("554ba2897fdd66239457fb33"), ObjectId("554ba28a7fdd66239457fb34") ]

ExtJS 用户模型

Ext.define('Group',
    extend: 'Ext.data.Model',
    idProperty : 'id',
    fields:[
        name:'group_id', type : 'string', mapping : '_id', persist : false,
        name:'name', type : 'string', mapping : 'name', persist : false
    ],
    hasMany :  model : 'User', foreignKey:'id' , name : 'users'
);

用户模型:

Ext.define('User',
    extend: 'Ext.data.Model',
    idProperty : 'id',
    fields:[
        name:'id', type : 'string', mapping : '_id', persist : false,
        name: 'name', type: 'string',
    ]
);

当我访问 group.users() 时在 EXTJS 代码中;

当我通过提供外键向模型添加关联时,在商店中使用 rest 方法会触发 GET 请求

/users?filter=["property":"group_id","value":"453490sdkjskldfjlskdjf","exactMatch":true]

但这是 mysql 的一种关联。

如何解决这个问题以适应 mongo 风格的关联?

所以我基本上希望这种情况发生。现在当我打电话 groups.users().load() 它使用像这样的过滤器参数向用户代理发出 GET 请求 /users?filter=["property":"group_id","value":"453490sdkjskldfjlskdjf","exactMatch":true]。但是我在用户中没有 group_id !所以它必须根据它在组对象的用户属性中找到的 ObjectId 来查询用户代理。

由于这在基于文档的数据库中很常见,默认情况下可以吗?我错过了什么吗? 谢谢。

【问题讨论】:

@Saki:嘿!我希望这发生 ->group.users().load(); 这应该获取用户并给我该组中的用户存储。此外,我已经设置了两个商店来拥有所有用户和组。有什么办法可以从当地商店买到吗? MongoDB 不是关系型数据库,我认为您不会发现 ExtJS 数据模块可以很好地与文档数据库配合使用。您可以创建一个面向 mongo 并以兼容方式处理关系的 API。我不知道为什么这么多开发人员将 mongo 用于关系数据。有更好的选择。无论如何,您可能想要这样的 API 来处理授权? 见***.com/questions/5841681/… 【参考方案1】:

关系 1:Ext 中的 many 的实现方式与 DBMS 中不同。在 DBMS 中,我们有两个表(类似于在 Ext 中存储的结构),并且关系由链接表之间记录的外键定义。

在 Ext 中,我们(可以)在一侧(组)有一个商店,但我们没有一个用于多方(用户)的商店。相反,组的每条记录都包含一个用户存储。它不完全是 store 的记录字段,但 Ext 定义了一个 getter。

在您的情况下,group.users() 返回一个包含属于该特定组的用户的商店。当您尝试加载 Ext 时,它的行为与任何其他商店完全相同:group.users().load() - 它只为该特定外键添加过滤器,因此您无需手动执行。

【讨论】:

是的,我正是希望这种情况发生。我想要存储该组中的用户。但是 EXTJS 生成的请求与我的后端不兼容,因为我在用户模式中没有 group_id。相反,我在组架构中有一个 user_id 列表。我可以让 EXTJS 获取其 ObjectIds 存在于 Group 的列表属性中的所有用户的商店吗?

以上是关于使用外键并映射到 EXTJS的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 DiscriminatorColumn 作为外键并加载实体

是否可以避免 OneToOne 关系中的代理主键并重用外键作为 id?

如何使用 Django 模型在 ExtJS 网格中获取外键值而不是键?

在哪种情况下使用 JPA @JoinTable 注释?

在反应中映射对象键并返回子属性

通过 NHibernate 代码映射将 GUID 属性作为外键映射到其他实体