使用外键并映射到 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?