Cette question a été posée deux fois auparavant dans le SO:mise en œuvre de nombreux à de nombreuses associations dans ExtJS 4
- https://stackoverflow.com/questions/10244753/extjs-many-to-many-association-how
- Extjs 4.1 many-to-many model association
Mais aucune de ces questions ont une réponse réelle , donc je vais essayer encore! Disons que j'ai deux modèles, User
et Group
. Un utilisateur peut appartenir à plusieurs groupes et les groupes peuvent contenir plusieurs utilisateurs. Voici le code de modèle pour User
:
Ext.define('User', {
extend: 'Ext.data.Model',
alias: 'model.User',
fields: [
{name: 'username', type: 'string'},
...
],
proxy: {
// Omitted for brevity...
},
});
Et Group
:
Ext.define('Group', {
extend: 'Ext.data.Model',
alias: 'model.Group',
fields: [
{name: 'name', type: 'string'},
...
],
proxy: {
// Omitted for brevity...
},
});
Maintenant, disons que je voulais une grille qui énumère mes groupes, et me permet de double-cliquez sur un groupe et modifier les utilisateurs sont dans ce groupe dans la deuxième grille. Disons aussi qu'il y a beaucoup d'utilisateurs par groupe, donc je ne veux pas charger tous les les utilisateurs associés lorsque je charge les groupes. Je veux pouvoir obtenir un magasin d'utilisateurs pour un groupe particulier, et le donner à ma grille, qui chargera les données selon les besoins (en utilisant la pagination habituelle que fait une grille).
Je vois deux approches potentielles ici. Il y a peut-être un autre meilleur moyen, mais je vais décrire ce que j'ai essayé de faire ci-dessous.
Modèle intermédiaire
- Ajouter un autre modèle de rejoindre
- Ajouter
hasMany
associations deUser
etGroup
à ce modèle - Ajouter
belongsTo
associations de mon modèle de rejoindre de nouveau la voie àUser
etGroup
.
Rejoindre Code modèle:
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'}
],
...
});
Association Group
:
associations: [
{type: 'hasMany', model: 'GroupUsers', name: 'group_users'}
],
Je vais maintenant être en mesure d'accéder à une boutique de GroupUsers
pour un Group
particulier:
group.group_users()
Le problème avec cette approche, c'est que je ne peux pas simplement lier un magasin de GroupUsers
à ma deuxième grille, parce que je veux afficher des choses comme le nom de l'utilisateur. Je pourrais itérer les articles du magasin, récupérer chaque objet User
avec getUser()
, les ajouter à un autre magasin, et l'utiliser pour ma grille, mais cela entraîne une demande de serveur par article!Alternativement, je pourrais utiliser mon magasin de GroupUsers
directement, mais alors aurait besoin de faire quelque chose avec des moteurs de rendu et j'ai encore besoin d'aller chercher chaque User
individuellement.
association directe
- associé
User
etGroup
directement avec une associationhasMany
sur chaque
associations sur Group
:
associations: [
{type: 'hasMany', model: 'User', name: 'users', foreignKey: '???'}
],
Je peux maintenant obtenir un magasin de réelle User
objets pour un groupe donné:
group.users()
Ce qui serait génial, sauf qu'il n'y a rien pour moi pour définir le foreignKey
de l'association. User
ne peut pas avoir un champ group_id
, car un User
peut avoir plusieurs Group
s!
La façon dont je le vois, supposons que nous avons l'information de magasin avec la structure GroupId, GroupName, UserId, UserName (un magasin combiné ayant tous les enregistrements récupérés en utilisant join). Supposons que nous ayons une grille pour afficher les enregistrements groupés par GroupId et afficher une liste de groupes, une fois développée, elle affiche la liste des utilisateurs de ce groupe. Maintenant, supposons qu'un clic sur un bouton réorganise le magasin et met à jour l'affichage de la grille pour afficher une liste d'utilisateurs, une fois développée, elle affiche la liste des groupes auxquels appartient l'utilisateur. La logique totale derrière ceci peut être implémentée avec la fonction de filtrage filterBy et de groupement du magasin –
@MohammadAftabUddin merci pour votre suggestion, mais il ne répond pas vraiment à la question, j'ai dit que je ne veux pas charger toutes les données à l'avance. –
Ce n'est probablement pas une solution pour vous, mais juste pour l'enregistrement, [ManyToMany] (http://docs.sencha.com/extjs/5.0.0/apidocs/#!/api/Ext.data.schema.ManyToMany) les associations sont soutenues dans ExtJS 5. – matt