Bonjour,
comment fait on pour remplir la table temporaire d'une relation n-n.
Version imprimable
Bonjour,
comment fait on pour remplir la table temporaire d'une relation n-n.
:salut:
La table supplémentaire qui permet de gérer une relation n-n est gérée automatiquement par la bibliothèque QxOrm.
Si tu souhaites avoir la main sur cette table, il faut alors décomposer ta relation : au lieu de définir une relation n-n (donc 2 entités), tu peux définir 2 relations 1-n puis n-1 (donc 3 entités) ==> tu auras ainsi la main sur les 3 tables.
Salut,
en faite ma question était plutôt, comment on s'en sert avec le model_service et dans le code?
Il n'y a pas de particularité aux relations n-n : d'un point de vue utilisation, c'est pareil qu'une relation 1-n ou n-1.
Le code que génère QxEntityEditor pour gérer les relations avec le moteur Model/View de Qt est plus basé pour un contexte d'utilisation QML.
Tu peux suivre ce tutoriel pour comprendre comment ça fonctionne : http://christophe-dumez.developpez.c...les-imbriques/
Bonsoir,
cela me m'aide pas du tout. Je suis complément perdu avec les relations n-n avec QxOrm. Pourtant avec les autres relations j'ai pas de soucis, mais avec la n-n, je n'y arrive pas.
Je vois pas comment faire un insert dans la table qui sert pour la relation n-n avec mon model.
Va falloir donner un peu de matière pour t'aider (du code, un exemple de ce que tu veux faire, plus de détails).Citation:
cela me m'aide pas du tout
Tout ce que je peux t'indiquer pour le moment est cet exemple de relation n-n dans le tutoriel suivant :
http://marty-lionel.developpez.com/t...-qxblog/#LVIII
En faite, pour les relations de type 1-n ou n-1, je fais comme ça puisque je peux accéder à la colonne de ma table qui stock l'id de l'autre table:
mais pour un relation n-n, les id sont dans une extra table. D'où ma question, comment fait on ? Peut-être que j'utilise très mal les relations aujourd'hui, mais je vois pas comment faire d'autre.Code:
1
2
3 QUuid teamId = _teamModel->getModelValue(teamIndex.row(), "Uuid").toUuid(); _userModel->setModelValue(userIndex.row(), "team_id", teamId.toString()); _userModel->qxSaveRow(userIndex.row());
Ok, je commence à comprendre comment tu utilises le module QxModelView avec les relations 1-n et n-1 (pour info, j'ai modifié le titre du sujet pour indiquer que tu essayes d'utiliser les relations n-n avec le module QxModelView, c'est important comme détail !).
En effet, avec les relations de type 1-n et n-1, ce que tu fais doit fonctionner.
Avant de t'expliquer une autre façon de faire pour gérer les relations avec le module QxModelView, je pense qu'il est important de lire et comprendre :
1- ce topic dans la FAQ de QxOrm : Comment utiliser le moteur de relations pour récupérer des données associées à plusieurs tables ? ;
2- ce tutoriel : Exposer des modèles C++ imbriqués à QML.
Remarque : concernant le tutoriel, même si il y a écrit QML dans le titre, ce qui suit fonctionne également avec une utilisation non QML.
Pour utiliser les relations (1-n, n-1 ou n-n) avec le module QxModelView, il est important de comprendre qu'il peut y avoir une hiérarchie entre modèles (un modèle parent peut avoir plusieurs modèles enfants associés, c'est la notion de modèles imbriqués du tutoriel ci-dessus).
Si je reprends ton exemple, tu as 2 modèles (_teamModel et _userModel) liés par une relation n-n, voici comment tu peux instancier tes 2 modèles pour avoir cette notion de hiérarchie (je le fais avec la classe qx::QxModel<T> mais c'est exactement le même principe avec qx::QxModelService<T, S>) :
1- en une seule requête (requête SQL si utilisation de qx::QxModel<T>, ou bien requête client-serveur si utilisation de qx::QxModelService<T, S>) :
2- ou bien en 2 requêtes :Code:
1
2
3 qx::IxModel * _teamModel = new qx::QxModel<Team>(); _teamModel->qxFetchById(<my_quuid>, "*"); // le paramètre "*" signifie qu'on récupère toutes les relations sur 1 niveau, on peut mettre aussi "User" si on souhaite récupérer uniquement la relation "User" qx::IxModel * _userModel = ((_teamModel->rowCount() > 0) ? static_cast<qx::IxModel *>(_teamModel->list_of_user(teamIndex.row())) : NULL); // la méthode list_of_user() est celle générée par QxEntityEditor pour gérer les relations avec le module QxModelView
Que tu utilises la méthode 1- ou 2-, tes 2 modèles _teamModel et _userModel sont liés par une hiérarchie parent-enfants.Code:
1
2
3 qx::IxModel * _teamModel = new qx::QxModel<Team>(); _teamModel->qxFetchById(<my_quuid>); qx::IxModel * _userModel = ((_teamModel->rowCount() > 0) ? static_cast<qx::IxModel *>(_teamModel->list_of_user(teamIndex.row(), true)) : NULL); // le 2ème paramètre (true) indique qu'on souhaite récupérer les données de la BDD, ce qui exécute une requête SQL ou client-serveur
Pour la sauvegarde, il suffit d'écrire :
Remarque : sur le fetch je pense que ça devrait fonctionner correctement. Sur la sauvegarde, j'ai un doute en relisant le code, je pense qu'il manque une synchronisation des données du modèle avant d'envoyer la requête. Si il y a un soucis sur la sauvegarde, j'apporterai une correction...Code:_teamModel->qxSaveRow(teamIndex.row(), "*"); // le paramètre "*" signifie qu'on enregistre en BDD le modèle ainsi que toutes ses relations, on peut aussi mettre "User" si on souhaite enregistrer le modèle + la relation nommée "User"
Dans tous les cas, c'est la façon 'générique' d'utiliser les relations avec le module QxModelView (relations 1-n, n-1 et n-n).
Autre remarque : pour utiliser les relations avec le module QxModelView, il est nécessaire d'utiliser QxEntityEditor pour générer toutes les méthodes d'accès aux relations.
Par défaut, les classes qx::QxModel<T> et qx::QxModelService<T, S> exposent au modèle toutes les propriétés simples enregistrées dans le contexte QxOrm, pour les relations (les propriétés complexes) il faut QxEntityEditor.
Bonsoir,
j'ai ajouté via une requête des lignes dans la table pivot (relation n-n, entre les teams et les tounaments).
Pour le fetch, cela marche bien si je modifie le model généré pour qu'il utilise le service.
Par contre, comme vous l'avez remarqué, l'insert dans cette table ne marche pas.Code:
1
2
3
4
5
6
7
8
9
10 void coreWindow::on_listViewTournament2_clicked(const QModelIndex &index) { if (index.isValid()) { _teamTournamentModel = static_cast<model_view::Team_model *>(_tournamentModel->list_of_teams(index.row(), true)); _ui->listViewTournamentTeam->setModel(_teamTournamentModel); _ui->listViewTournamentTeam->setModelColumn(1); } }
J'ai fait ceci pour tenter un update dans ma table pivot:Citation:
sur le fetch je pense que ça devrait fonctionner correctement. Sur la sauvegarde, j'ai un doute en relisant le code, je pense qu'il manque une synchronisation des données du modèle avant d'envoyer la requête. Si il y a un soucis sur la sauvegarde, j'apporterai une correction...
Pouvez vous voir si cela vient de mon coté ou du votre ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 void coreWindow::on_buttonAddTeamTournament_clicked() { QModelIndex tournamentIndex = _ui->listViewTournament2->currentIndex(); QModelIndex teamIndex = _ui->listViewTeam3->currentIndex(); if (tournamentIndex.isValid() && teamIndex.isValid()) { model_view::Tournaments_model * _testModel = new model_view::Tournaments_model(); QStringList relation; relation << "*"; _testModel->qxFetchById(tournamentIndex.row(), relation); _teamTournamentModel = static_cast<model_view::Team_model *>(_testModel->list_of_teams(tournamentIndex.row(), true)); _teamTournamentModel->qxInsertRow(teamIndex.row()); _testModel->qxSaveRow(teamIndex.row(), relation); _ui->listViewTournamentTeam->setModel(_teamTournamentModel); } }
merci.
ps: Bonne année et meilleur vœux
:ccool:Citation:
Pour le fetch, cela marche bien
Ton fetch est nickel : ta variable _tournamentModel est le modèle parent, et _teamTournamentModel est un modèle enfant.
IMPORTANT : à présent, si tu veux enregistrer, il faut toujours utiliser le modèle parent.
Il y a certainement un soucis sur l'enregistrement dans le module QxModelView (comme je l'ai dit je pense qu'il manque une synchronisation des données (des relations) avec le modèle avant enregistrement), mais voici comment tu devrais faire (je repars de ton fetch) pour insérer des éléments dans _teamTournamentModel :Citation:
l'insert dans cette table ne marche pas.
Pouvez vous voir si cela vient de mon coté ou du votre ?
Tu peux essayer comme ça (en tout cas, c'est comme ça que ça doit fonctionner), si ça ne fonctionne pas, j'apporterais une correction pour effectuer cette synchronisation entre les données (des relations) et le modèle avant enregistrement...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 void coreWindow::on_listViewTournament2_clicked(const QModelIndex &index) { if (index.isValid()) { _teamTournamentModel = static_cast<model_view::Team_model *>(_tournamentModel->list_of_teams(index.row(), true)); _ui->listViewTournamentTeam->setModel(_teamTournamentModel); _ui->listViewTournamentTeam->setModelColumn(1); // on ajoute un élément à _teamTournamentModel _teamTournamentModel->insertRow(); // ici tu rentres les données que tu souhaites pour ce nouvel élément _teamTournamentModel->setData(....); // Enfin on enregistre en BDD (ou en utilisant les services), en passant par le modèle parent et en indiquant en paramètre qu'on souhaite enregistrer les relations _tournamentModel->qxSaveRow(my_row, "*"); } }
Bonjour,
j'ai beau essayer, cela ne marche pas.
Pouvez vous apporter un correctif ?Citation:
Tu peux essayer comme ça (en tout cas, c'est comme ça que ça doit fonctionner), si ça ne fonctionne pas, j'apporterais une correction pour effectuer cette synchronisation entre les données (des relations) et le modèle avant enregistrement...
Voici un correctif, il faut mettre à jour QxOrm (version 1.3.1 BETA 33) et exporter ton projet avec la nouvelle version de QxEntityEditor (version 1.1.7 BETA 64) :Citation:
Pouvez vous apporter un correctif ?
- QxOrm 1.3.1 BETA 33 : http://www.qxorm.com/version/QxOrm_1.3.1_BETA_33.zip
- QxEntityEditor 1.1.7 BETA 64 : http://www.qxorm.com/version/QxEntit...64_win_32b.zip
Remarque : il est nécessaire de ré-exporter ton projet avec QxEntityEditor car de nouvelles méthodes sont générées pour effectuer la synchronisation des modèles imbriqués (ceux liés à une relation) avant d'envoyer les données en BDD.
Comme tu utilises les modèles connectés aux services, je te conseille d'utiliser la nouvelle option qui permet de générer des modèles basés sur la nouvelle classe qx::QxModelService<T, S> (menu Tools >> Export to C++ model/view project (settings)) :
Pièce jointe 166215
Il y a toujours un problème avec le génération des Models avec les services.
Les méthodes ne dépendent toujours pas du services.
cela sera t-il corrigé ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 QObject * Session_model::list_of_modules(int row, bool bLoadFromDatabase /* = false */, const QString & sAppendRelations /* = QString() */) { QString sRelation = "list_of_modules"; qx::IxModel * pChild = (bLoadFromDatabase ? NULL : this->getChild(row, sRelation)); if (pChild) { return static_cast<QObject *>(pChild); } if ((row < 0) || (row >= this->m_model.count())) { qAssert(false); return NULL; } Session_model_base_class::type_ptr ptr = this->m_model.getByIndex(row); if (! ptr) { qAssert(false); return NULL; } QUuid id = ptr->getSession_id(); Session::type_list_of_modules value = ptr->getlist_of_modules(); if (bLoadFromDatabase) { if (! sAppendRelations.isEmpty() && ! sAppendRelations.startsWith("->") && ! sAppendRelations.startsWith(">>")) { sRelation += "->" + sAppendRelations; } else if (! sAppendRelations.isEmpty()) { sRelation += sAppendRelations; } Session tmp; tmp.setSession_id(id); this->m_lastError = qx::dao::fetch_by_id_with_relation(sRelation, tmp); if (this->m_lastError.isValid()) { return NULL; } value = tmp.getlist_of_modules(); ptr->setlist_of_modules(value); } model_view::Module_model * pNewChild = NULL; pChild = qx::model_view::create_nested_model_with_type(this, QModelIndex(), value, pNewChild); if (pChild) { this->insertChild(row, "list_of_modules", pChild); } return static_cast<QObject *>(pChild); }
Ah oui, mince ! J'avais oublié ça :aie:Citation:
Les méthodes ne dépendent toujours pas du services.
Voici un correctif (QxEntityEditor 1.1.7 BETA 67) : http://www.qxorm.com/version/QxEntit...67_win_32b.zip
Il faut que tu ré-exportes ton projet model/view avec cette nouvelle version de QxEntityEditor.