在Ext Js 4中实现ManyToMany关联

时间:2011-08-17 15:57:10

标签: many-to-many associations extjs4

我在网上到处都看了看,但我似乎找不到在Est Js 4模型中实现多对多关联的方法。以原型为例。我有一个带有“帖子”和“标签”的应用程序。我如何在Ext Js 4模型中表示这一点,并按标签按帖子和帖子过滤标签?

3 个答案:

答案 0 :(得分:4)

ManyToMany意味着有一些额外的表(或数组)来包含A和B之间的链接。所以实现这一点的唯一方法是使用额外的存储。

如果有很多项目,每个项目可以属于许多类别,这里是模型定义:

Ext.define('BS.model.Item', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'name'                 , type: 'string'},
    ],

    proxy: {
        type: 'direct',

        api: {
            create: Items.Create,
            read: Items.GetTree,
            update: Items.Update,
            destroy: Items.Delete,
        },
    },

    hasMany: {model: 'BS.model.ItemInCategory', name: 'categories', foreignKey: 'itemId'},
});

Ext.define('BS.model.ItemCategory', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'name'     , type: 'string'},
    ],

    proxy: {
        type: 'direct',

        api: {
            create: ItemCategories.Create,
            read: ItemCategories.Read,
            update: ItemCategories.Update,
            destroy: ItemCategories.Delete,
        },
    },

});

Ext.define('BS.model.ItemInCategory', {
    extend: 'Ext.data.Model',
    fields: ['itemId', 'categoryId'],

    // This will allow create operations with multiple records
    clientIdProperty: 'clientId',

    proxy: {
        type: 'direct',

        api: {
            create:  ItemInCategory.Create,
            read:    ItemInCategory.Read,
            destroy: ItemInCategory.Destroy,
        },

        reader: {
            type: 'json',
            root: 'data',
        },        
    },

});

然后获取项目所属的所有类别:

Item.categories().load({
    scope: this,
    callback: function( aRecords, aOperation, aSuccess) {

        Ext.each( aRecords, function( aAssociation ) {
            // Do something here
        }, this);

    }                
});

然后添加关联:

var iNewRecord = Item.categories().model.create( { categoryId: '16' } );

Item.categories().add( iNewRecord );

答案 1 :(得分:1)

对于在搜索时发现此问题的人,从ExtJS 5.0开始,他们本地支持多对多关系:

http://docs.sencha.com/extjs/5.0.0/apidocs/#!/api/Ext.data.schema.ManyToMany

答案 2 :(得分:0)

对于ExtJS 6,也实现了ManyToMany

最小化实施:

Ext.define('App.models.Group', {
 extend: 'Ext.data.Model',

 manyToMany: [
     'User'
 ]

});