|
Publicité ' | ||||||||||||||||||||||
|
|
#1 | ||||
|
Membre régulier
![]() Inscription : août 2002 Messages : 165 ![]() |
Bonjour,
J'essai de réaliser une relation n-n sous doctrine mais rien ni fait. J'ai pourtant suivi pas mal de tuto, mais lorsque j'essai d'exploiter mes tables, pas de relation. Je suis parti d'un fichier yaml pour générer ma table MySQL : Code :
Ensuite dans mon code Php j'essai une requête de ce type (ressortir toutes les entreprises d'une catégorie) : Code :
Code :
echo('<pre>'.$queryEntreprisesByCategorie->getSqlQuery().'</pre>'); Code :
SELECT e.id AS e__id, e.intitule AS e__intitule FROM entreprise e, entreprise_categorie e2 WHERE (e2.categorie_id = 1 AND (e.deleted_at IS NULL)) Merci de votre aide ! |
||||
|
|
00
|
|
|
#2 | ||
![]() ![]() Benjamin PREVOTArchitecte de système d'information Inscription : septembre 2004 Messages : 1 568 ![]() |
Bonjour,
Il me semble que la syntaxe du leftJoin est incorrecte. Essaie ceci (non testé) Code :
__________________
Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN F.A.Q. : Java, PHP, (X)HTML / CSS N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème |
||
|
|
00
|
|
|
#3 | ||||
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Le shema revu "a ma façon" (redéfinition des relations)
Code :
Code :
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
||||
|
10
|
|
|
#4 | ||
|
Membre régulier
![]() Inscription : août 2002 Messages : 165 ![]() |
Merci pour vos réponses !
@Michel Rotta : Je ne travail pas avec Symfony, j'utilise uniquement Doctrine en fait. J'ai modifier mon fichier YAML avec ta variante et la requête générée est bonne : Code :
SELECT e.intitule AS e__0 FROM categorie c LEFT JOIN entreprise_categorie e2 ON (c.id = e2.categorie_id) LEFT JOIN entreprise e ON e.id = e2.entreprise_id AND (e.deleted_at IS NULL) WHERE (c.id = 1) Par contre en code, je n'arrive à récupérer qu'une seule ligne : Code :
|
||
|
|
00
|
|
|
#5 |
|
Membre régulier
![]() Inscription : août 2002 Messages : 165 ![]() |
Hum d'ailleurs je viens de me rendre compte que je ne poste pas dans le bon sous-forum. Si vous voulez déplacer le post, désolé !
|
|
|
00
|
|
|
#6 | ||
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Je déplace. Je ne mettrais plus jamais jamais en rouge dans la nouvelle salle...
Je ne vois pas trop d'où le problème pourrait venir. le fechtArray() lance simplement un execute() avec un paramètre qui demande un array en retour. Que donne un var_dump() du tableau récupéré ? Je pense que ton code devrait plutôt être : Code :
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
||
|
00
|
|
|
#7 | |||
|
Membre régulier
![]() Inscription : août 2002 Messages : 165 ![]() |
Pour le var_dump :
Code :
Citation:
|
|||
|
|
00
|
|
|
#8 | ||||
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Tout est caché ici :
Code :
Je m'explique. "execute()" retourne par défaut une collection (Doctrine_Collection) d'enregistrement (Doctrine_Record). Dans ton cas tu as donc une collection d'un record. Vu que tu as une relation tu as donc soit des enregistrement, soit, ici, des collections. Dans le shema tu définis une relations n-n entre tes deux tables. le getter getEntreprises() permet de récupérer la Doctrine_Collection des Doctrine_Record qui correspondent aux 9 objets récupérés dans la table liée. Vu que ton code ne peut retourner qu'une catégorie, il est plus simple de récupérer directement le Doctrine_Record qui correspond, il faut donc modifier le execute par Code :
$categorie= $queryEntreprisesByCategorie->fechtOne(); La convention veut que les variables et les getter qui contiennent/retourne des collections portent un "s" ou un "x" à la fin. A noter que tu pourrais très bien te passer de faire une requête compliquée, en effet, le code suivant marchera aussi : Code :
A noter aussi qu'il peut être plus intéressant d'hydrater les données, regarde dans la documentation doctrine, l'espace mémoire et la rapidité d'exécution sont largement augmenter, du moins en ce qui concerne l'affichage, s'il y a modification, il faut conserver le modèle objet.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
||||
|
00
|
|
|
#9 |
|
Membre régulier
![]() Inscription : août 2002 Messages : 165 ![]() |
Merci pour ton aide, j'ai finalement opter pour la 2eme solution et tout fonctionne. Je commence à y voir un peu plus clair.
Je me permet de poser une autre question lié à Doctrine (seul). C'est plus niveau architecture, mais je voulais pas créer un nouveau post juste pour ça. Toutes les recherches me parle du couple Symfony/Doctrine. J'ai un formulaire affichant les informations de mon client. Je peux modifier ses informations et valider pour enregistrer les nouvelles données en base de données. Actuellement, au chargement de mon formulaire, je récupère mon objet client avec un getTable('Client')->findOneById($id), et j'affiche les infos avec des echo dans mes fields de mon form. Maintenant je me pose la question sur l'enregistrement. En php simple, ça nous demande de rafraichir/changer de page. Mais comment mettre à jour mon client proprement ? J'ai deux idées : * Garder en session un objet Client. Celui-ci sera affiché lorsqu'on affiche le formulaire. Puis lors de la validation, je rempli l'objet avec les nouvelles données du formulaire et je fais un save(). Dans ce cas, j'ai peur de pas toujours être synchronisé entre mon objet en session et les valeurs en BD (connexion sur un autre pc, etc). * Sinon, le faire un peu bourrin : récupération de mon client pour affichage des données. Et récupération de nouveau de mon client pour mettre à jour ses infos + un save(). Symfony semble simplifier le concept, mais je ne peux pas partir dessus sur ce petit projet. Merci de ton aide en tout cas. |
|
|
00
|
|
|
#10 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Je ne comprend pas trop pourquoi tu n'utilises pas les form de symfony pour ce qui est génération et, surtout, validation des formulaires.
Pour le numéro d'enregistrement, en général je le passe dans l'url. Par contre il est sur que, pour le détail de l'utilisateur ce n'est pas l'idéal. Après, tout dépend de ta gestion d'utilisateur, si tu utilises sfGuard, tu peux récupérer l'objet du user avec un getUserObject() (a vérifier nom de la méthode) depuis ton ton objet user. Tu as alors un sfRecord qui peut être utilisé comme un objet récupéré par un findOneByTruc...
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#11 |
|
Membre régulier
![]() Inscription : août 2002 Messages : 165 ![]() |
Salut,
Merci pour tes conseils. Du coup j'ai remonté mon projet sous Symfony. Pour l'instant, j'ai créé mon module entreprise et généré tout ce qui est liste et formulaire. Tout fonctionne bien sans trop d'efforts. Mon problème vient toujours de ma relation n-n. Dans le form généré j'ai bien la possibilité d'affecter mon entreprise à plusieurs catégories via une listbox (à choix multiple). Mais maintenant je voudrais afficher ses catégories dans son détail. Et c'est là ma question : Est-ce que je dois ajouter une fonction executeCategories() dans mon actions.class.php et affecter mes catégories à une var : $this->categories et ensuite utiliser la var $categories dans mon templates ? comme expliquer ici : http://www.symfony-project.org/jobee...Doctrine/fr/04 J'ai essayé, mais ma var $categories n'existe pas. Faut-il appeler executeCategories() à un moment donné ? Il ne le précise pas dans le tuto. Mais j'imagine que c'est nécessaire. Merci de ton aide. |
|
|
00
|
|
|
#12 |
|
Membre régulier
![]() Inscription : août 2002 Messages : 165 ![]() |
Bon je commence à piger le fonctionnement.
J'ai ajouté mes infos tests supplémentaires dans la fonction executeShow avec un $this->varTest = "..."; et j'arrive a la récupérer coté template avec un $varTest. Il ne me reste plus qu'à récupérer les catégories et les renvoyer de la même façon. Je ferme la discussion pour le coup. Merci de votre aide ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com