許多-to-many關聯這個問題已經被問過兩次,在這樣:實現在ExtJS的4
- https://stackoverflow.com/questions/10244753/extjs-many-to-many-association-how
- Extjs 4.1 many-to-many model association
但無論這些問題有一個實際的回答,所以我會再試一次!
比方說,我有兩種型號,User
和Group
。用戶可以處於多個組中,並且組可以包含許多用戶。下面是User
型號代碼:
Ext.define('User', {
extend: 'Ext.data.Model',
alias: 'model.User',
fields: [
{name: 'username', type: 'string'},
...
],
proxy: {
// Omitted for brevity...
},
});
而且Group
:
Ext.define('Group', {
extend: 'Ext.data.Model',
alias: 'model.Group',
fields: [
{name: 'name', type: 'string'},
...
],
proxy: {
// Omitted for brevity...
},
});
現在,讓我們說我想要一個網格,其中列出我的羣,並讓我雙擊該用戶的組和編輯是在第二個網格中的該組中。
我們還要說每組有很多用戶,所以我不想在加載組時加載所有關聯的用戶。
我希望能夠獲得特定組的用戶存儲,並將其提供給我的網格,該網格將根據需要加載數據(使用網格通常的分頁方式)。
我在這裏看到兩種可能的方法。還有另一種更好的方法,但我會概述我在下面做過的嘗試。
中間模型
- 添加另一個加盟模式
- 從
User
和Group
添加hasMany
協會該模型 - 從我加盟模式返回的途中添加
belongsTo
協會User
和Group
。
加入型號代碼:
Ext.define('GroupUsers', {
extend: 'Ext.data.Model',
alias: 'model.GroupUsers',
fields: [
{name: 'group_id', type: 'int'},
{name: 'user_id', type: 'int'},
],
associations: [
{type: 'belongsTo', model: 'User'},
{type: 'belongsTo', model: 'Group'}
],
...
});
協會Group
:
associations: [
{type: 'hasMany', model: 'GroupUsers', name: 'group_users'}
],
我現在能夠訪問的GroupUsers
商店特定Group
:
group.group_users()
這種方法的問題在於,我不能僅將GroupUsers
的商店綁定到我的第二個網格,因爲我想顯示諸如用戶名的內容。我可以迭代商店的商品,使用getUser()
獲取每個User
對象,將它們添加到另一個商店,然後將其用於我的網格,但會導致服務器請求每個商品!或者,我可以直接使用我的GroupUsers
商店,但之後需要對渲染器執行某些操作,而我仍然需要單獨獲取各個User
。
直接關聯
- 副
User
並與hasMany
協會每個
協會上Group
Group
直接:
associations: [
{type: 'hasMany', model: 'User', name: 'users', foreignKey: '???'}
],
我現在可以得到的實際商店User
個對象爲一組給定:
group.users()
這將是巨大的,但沒有什麼對我來說,設置關聯的foreignKey
。 User
不能有group_id
字段,因爲User
可以有多個Group
!
我看到它的方式,讓我們假設我們有商店信息與結構GroupId,GroupName,UserId,UserName(聯合商店所有記錄使用聯接提取)。假設我們有一個網格來顯示按GroupId分組的記錄並顯示組列表,當展開時顯示該組下的用戶列表。現在,假設按鈕點擊將重新排列商店並更新網格顯示以顯示用戶列表,當展開時顯示用戶所在的組列表。這背後的邏輯總體可能是通過商店的filterBy和分組網格功能來實現的 –
@MohammadAftabUddin感謝您的建議,但它並沒有真正回答這個問題,我確實說過我不想預先加載所有數據。 –
這可能對您沒有任何解決方案,但僅用於記錄,[ManyToMany](http://docs.sencha.com/extjs/5.0.0/apidocs/#!/api/Ext.data.schema.ManyToMany) ExtJS 5支持關聯。 – matt