Encore une fois merci pour toutes ces informations et le temps que tu y as consacré ! J'espère que ce sujet servira a beaucoup de monde.
A plus Bruno On 27 juil, 20:23, Colin Darie <[email protected]> wrote: > Le champ utilisations appartient à l'objet JoueurCompetence, donc il doit > être manié à partir cet objet. > Pour arriver à cet objet il y a 2 moyens, à toi de voir celui qui correspond > le mieux à ton cas : > - soit tu récupères cet objet comme n'importe quel autre et donc tu peux > faire classiquement $JoueurCompetence->utilisations = y; > - soit tu passes par le joueur et là tu peux faire > $Joueur->Competences[0]->utilisations = y ou > $Joueur->Competences[1]->utilisations = z etc... > > Dans ce derniers cas, tous les objets JoueurCompetence sont dans le tableau > (en fait l'objet Doctrine_Collection) $Joueur->Competences , mais comme tu le > vois c'est pas très pratique de passer par cet tableau car son indexation > n'est pas très utilisable. > > C'est là qu'intervient le keyword "INDEX BY" à écrire dans la méthode > getXXX() que tu as surchagée précédemment. Cela permet de dire à doctrine > d'indexer ce tableau par un champ que tu indiques toi > :http://www.doctrine-project.org/documentation/manual/1_1/en/dql-doctr.... > Donc dans ta jointure tu écriras par exemple > ->leftJoin('JoueurCompetence jc INDEX BY jc.competence_id') > > Et donc tu pourras faire $Joueur->Competences[13]->utilisations = y pour > accéder à l'objet JoueurCompetence ayant 13 comme competence_id. > > En revanche attention car dans ce cas, $joueur->Competences[] = $idCompetence > aboutira à dés résultats imprévisibles vu que dans ce cas tu ne controles pas > l'index du tableau, ça peut donc rentrer en conflit avec le tableau récupéré > par INDEX BY. > > Le mieux, pour ajouter une compétence à un joueur, c'est de créer le joueur, > le sauver, puis créer un objet JoueurCompetence par compétence en assignant à > chacun d'entre eux l'id du joueur ajouté et de la compétence associée. C'est > la méthode la plus performante et celle recommandée car indépendante des > INDEX BY et des collections. > cfhttp://www.doctrine-project.org/documentation/manual/1_1/en/working-w... > > Bon courage > > 2009/7/27 Bruno <[email protected]>: > > > > > > > Je répond à ma première question de moi même, pour insérer un champ en > > many2many, il suffit de faire dans mon cas : > > $joueur = new Joueur(); > > $joueur->Competences[] = $idCompetence; > > $joueur->Competences[] = $idCompetence2; > > $joueur->save(); > > > En revanche, je n'ai pas trouvé comment mettre à jour mon champ > > `utilisations` contenu dans ma table `JoueurCompetence`... faut-il le > > déclarer dans les relations du schema.yml ? > > > Encore merci par avance > > > On 27 juil, 02:20, Bruno <[email protected]> wrote: > >> Je reviens vers toi pour deux questions. > > >> La première, comment fais-t-on pour faire référence aux champs > >> contenus dans la table de liaison ? Si on reprend mon exemple, on voit > >> que ma table `JoueurCompetence` contient un champ `utilisations` qui > >> permet de stocker le nombre de fois que le joueur a utilisé la > >> compétence. > >> Comment fais-t-on pour y faire référence ? Est-ce que $joueur- > > >> >competences->getUtilisations() pourrait marcher ? > > >> Autre question, sûrement un peu bête, mais j'aimerai savoir comment > >> fais-t-on pour insérer une entrée dans la table de liaison ? Et > >> toujours en prenant en compte ce champs `utilisations` ! > > >> Je te remercie une fois de plus de ton aide :-) > > >> Bruno > > >> On 26 juil, 20:59, Colin Darie <[email protected]> wrote: > > >> > Il en effet primordial d'un point de vue des performances de surcharger > >> > les getXXX() pour faire la ou les jointures adéquates lorsque les objets > >> > correspondants ont besoin systématiquement de données aggrégées depuis > >> > d'autres tables. C'est d'ailleurs valable quel que soit le type de > >> > relation. > > >> > 2009/7/26 Bruno <[email protected]> > > >> > > Je suis d'accord avec toi sur le principe d'écrire le schéma > >> > > directement en .yml, mais je trouvais l'outils Mysql Workbench > >> > > vraiment intéressant dans la mesure ou il me permettait d'avoir un > >> > > schéma visuel ET une base en parfait harmonie constamment. > >> > > Cependant, il est vrai que je peux toujours faire du "reverse > >> > > engeneering" pour retrouver mon schema à partir de ma base généré > >> > > depuis le .yml... > > >> > > En attendant vos réponses, j'ai fait quelque chose d'autre, j'aimerai > >> > > en connaître ton avis. > >> > > En fait mon problème c'était que lorsque je demandais la table relié > >> > > en many to many, il me généré un surplus de requête pour obtenir les > >> > > infos entrée par entrée, j'ai donc modifié mon fichier > >> > > JoueurCompetenceTable.php pour surcharger la requête > >> > > getJoueurCompetence() et lui faire renvoyer la liste des compétences > >> > > en jointure avec la table joueur_competence. > >> > > L'avantage de cela c'est que je contrôle parfaitement mes requêtes et > >> > > comme je ne touche pas au fichier *Base.php, je n'ai à le faire qu'une > >> > > fois. > >> > > L'inconvénient c'est que je vais devoir surcharger cette méthode > >> > > chaque fois que j'aurai besoin de récupérer une table d'une relation > >> > > many2many, et j'en ai pas mal ! > > >> > > Je vais réfléchir à ta solution à nouveau, et tenter d'écrire mon > >> > > schéma directement en .yml. > > >> > > Merci de tes conseils et de ton temps > > >> > > On 25 juil, 17:42, Colin Darie <[email protected]> wrote: > >> > > > C'est à mon avis normal que la conversion base > schéma ne conserve > >> > > > pas les relations many-to-many car elle ne fait que retranscrire la > >> > > > structure des tables existantes, et aux yeux de la base le m2m n'est > >> > > > rien d'autre que 2 relations one-to-many. > > >> > > > Si tu souhaites continuer à utiliser MySQL Workbench, pour éviter à > >> > > > chaque fois de rajouter ces relations à la main dans le schéma, et > >> > > > si t'es sous un système linux, tu n'as qu'à créer un simple patch > >> > > > qui contient ces quelques lignes supplémentaires, patch que tu > >> > > > n'auras plus qu'à appliquer simplement après chaque génération du > >> > > > schema. Tu peux même écrire une tache symfony qui lancera > >> > > > doctrine:build-schema puis qui appliquera le patch immédiatement > >> > > > après pour tout faire d'un coup. > > >> > > > Autrement je pense que ça vaut vraiment la peine d'investir du temps > >> > > > pour apprendre à écrire directement et rapidement les schemas en > >> > > > yml, ça évite bien des surprises dans ce genre car là ce sont les > >> > > > m2m qui ne sont pas conservées, mais une autre fois ça sera > >> > > > peut-être autre chose dont tu ne te rendras pas forcément compte > >> > > > (sans parler du fait que ça ne t'écrira jamais le yml pour utiliser > >> > > > des behavior !) Une fois qu'on a l'habitude d'écrire les schemas > >> > > > manuellement, ça va vraiment très vite même pour des très grandes > >> > > > structures (rien n'empêche d'ailleurs de modéliser la base par un > >> > > > outil graphique avant si on le souhaite). > > >> > > > 2009/7/24 Bruno <[email protected]>: > > >> > > > > Ok Colin, mais justement, le but de ma question était de savoir si > >> > > > > il > >> > > > > n'y avait pas un moyen de rendre cette tache automatique, car sans > >> > > > > ça, > >> > > > > je risque de me retaper ce changement à la main à chaque fois que > >> > > > > je > >> > > > > veux mettre à jour mon schéma sous Mysql Workbench... > >> > > > > Enfin vous êtes deux à me proposer cette unique solution, je pense > >> > > > > que > >> > > > > je n'aurai pas le choix, et c'est bien dommage ! > > >> > > > > Merci de votre aide, mais si quelqu'un passe par là et a une > >> > > > > solution, > >> > > > > je suis toujours preneur ! > > >> > > > > Bruno > > >> > > > > On 24 juil, 17:43, Colin Darie <[email protected]> wrote: > >> > > > >> C'est normal que $Joueur->Competence ne marche pas car dans ton > >> > > > >> schema la relation m2m entre Joueur et Competence n'est pas > >> > > > >> définie. Il faut la rajouter manuellement comme on te l'a suggéré. > > >> > > > >> Par exemple : > > >> > > > >> Joueur: > >> > > > >> columns: > >> > > > >> [...] > >> > > > >> relations: > >> > > > >> Competences: > >> > > > >> class: Competence > >> > > > >> refClass: JoueurCompetence > >> > > > >> local: joueur_id > >> > > > >> foreign: competence_id > >> > > > >> foreignAlias: Joueurs > > >> > > > >> Ainsi tu pourras faire $Joueur->Competences qui retournera une > >> > > > >> instance de Doctrine_Collection (ou un tableau) avec toutes les > >> > > > >> compétences. Vice-versa, si t'en as besoin tu pourras faire > >> > > > >> $Competence->Joueurs qui retournera les joueurs d'une compétence > >> > > > >> (grâce au foreignAlias). > > >> > > > >> 2009/7/24 Bruno <[email protected]>: > > >> > > > >> > Bonjour et merci de votre aide, > > >> > > > >> > @[email protected] : > >> > > > >> > Oui la structure est impeccable, toutes les contraintes de clés > >> > > > >> > étrangères sont respectés, et tous les contrôles fonctionnent > >> > > > >> > bien, > >> > > > >> > c'est bien pour ça que je trouve étrange que la génération du > >> > > > >> > schema > >> > > > >> > ne les reproduise pas. > > >> > > > >> > @Lelio ML : > >> > > > >> > Effectivement, pour ma table `JoueurCompetence`, ce sont deux > >> > > > >> > many2one, vers Joueur et Competence qui sont bien reproduit sur > >> > > > >> > le > >> > > > >> > schema.yml. > >> > > > >> > En revanche, ce que je n'arrive pas a faire, c'est récupérer > >> > > > >> > toutes > >> > > > >> > les compétences d'un joueur en faisant Joueur->competence, ce > >> > > > >> > que j'ai > >> > > > >> > vu fonctionner sur un tutoriel. > >> > > > >> > Actuellement je suis oblige de faire > >> > > > >> > $joueur->getJoueurCompetence() et > >> > > > >> > enfin dans ma boucle un $joueurCompetence->getCompetence(), ce > >> > > > >> > qui a > >> > > > >> > pour effet de me générer une nouvelle requête SQL. > >> > > > >> > Peut être que je m'y prend mal quelque part ? > >> > > > >> > Voici l'extrait de mon schema.yml > > >> > > > >> > # Joueur > >> > > > >> > Joueur: > >> > > > >> > tableName: joueur > >> > > > >> > columns: > >> > > > >> > id: > >> > > > >> > type: integer(4) > >> > > > >> > unsigned: 1 > >> > > > >> > primary: true > >> > > > >> > > > ... > > plus de détails » > > signature.asc > < 1 000AfficherTélécharger --~--~---------~--~----~------------~-------~--~----~ Vous avez reçu ce message, car vous êtes abonné au groupe Groupe "Symfony-fr" de Google Groupes. Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse [email protected] Pour résilier votre abonnement à ce groupe, envoyez un e-mail à l'adresse [email protected] Pour afficher d'autres options, visitez ce groupe à l'adresse http://groups.google.com/group/symfony-fr?hl=fr -~----------~----~----~----~------~----~------~--~---
