Bonjour à tous,
J'essaie de traduire une requête SQL à base de Inner Join avec Doctrine mais j'ai invariablement une erreur.
Ma requête SQL fonctionne, mais pas sa transposition via Doctrine.
Pour être plus précis, voici le schéma qui m'a permis de générer la DB :
J'ai donc une table Diu, une table Specialite, et une table intermédiaire DiuSpecialite qui me sert de liaison dans ma relation n-n, un Diu pouvant recouvrir plusieurs spécialités, et une spécialité avoir plusieurs DIU.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
31
32
33
34
35
36
37
38
39
40 Diu: columns: nom_diu: { type: string(255), notnull: true } (...) ################################################## Specialite: actAs: NestedSet: hasManyRoots: true rootColumnName: root_id columns: nom_specialite: type: string(255) notnull: true relations: #On définit ici la relation n-n entre la table des DIU et la table des Spéciliatés. Dius: #On donne le nom de la relation, en utilisant le nom de la table liée au pluriel foreignAlias: Specialites #Alias optionnel correspondant à la table courante (nom au pluriel) class: Diu #la classe (ie la table) qui est liée à Specialite refClass: DiuSpecialite #Nom de la table intermédiaire local: specialite_id #Référence à l'object courant (Specialite) avec le nom de la colonne le concernant dans DiuSpecialite foreign: diu_id #Idem avec la table Diu DiuSpecialite: #Définition de la table intermédiaire columns: diu_id: { type: integer, primary: true } specialite_id: { type: integer, primary: true } relations: Diu: onDelete: cascade #le paramètre cascade permet de supprimer les lignes concernant soit une specialite soit un diu si celui-ci est supprimé. local: diu_id #local représente la colonne de la table DiuSpecialite foreign: id #foreign prend ici le nom de la colonne dans la table Diu (afin que Doctrine puisse faire le lien entreles clés primaires) foreignAlias: DiuSpecialites Specialite: onDelete: cascade local: specialite_id foreign: id foreignAlias: DiuSpecialites
Je cherche à récupérer tous les DIU d'une spécialité ; ma requête SQL est donc celle-ci :
Cette requête fonctionne comme attendue, j'obtiens bien les éléments recherchés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7SELECT * FROM diu d INNER JOIN diu_specialite ds ON ds.diu_id = d.id INNER JOIN specialite s ON ds.specialite_id = s.id WHERE s.nom_specialite = 'Acupuncture'
En revanche j'ai plus de mal pour la traduction avec Doctrine... Voici ma requête :
Et j'ai alors le message d'erreur suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $this->liste=Doctrine_Query::create() ->select('d.nom_diu') ->from('Diu d') ->innerJoin('DiuSpecialite ds ON ds.diu_id = d.id') ->innerJoin('Specialite s ON s.id = ds.specialite_id') ->where('s.nom_specialite = "Acupuncture"') ->execute();
500 | Internal Server Error | Doctrine_Table_Exception
Unknown relation alias
avec entre autres les détails suivants :
Je comprends donc qu'il y a un problème au niveau de la définition des relations et/ou de leur utilisation mais je vois pas bien lequel...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 at () in SF_ROOT_DIR/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Relation/Parser.php line 237 ... return $this->getRelation($alias, false); } else { throw new Doctrine_Table_Exception('Unknown relation alias ' . $alias); } }
J'aurais donc plusieurs questions :
- Que dois-je changer dans ma requête Doctrine pour qu'elle fonctionne comme ma requête SQL ?
- Est-ce un bon moyen de procéder pour effectuer cette requête ou y a t-il un moyen plus simple/efficace de faire (compte-tenue de ma relation n-n entre les 2 tables avec une table intermédiaire) ?
Merci d'avance pour vos réponses
Partager