Salut à toutes et à tous
Plongé dans l'internationalisation de ma db, je me retrouve face à un comportement que je trouve, si pas étrange, pour le moins dérangeant...
Le modèle d'une page est défini comme suit:
Lors de l'affichage d'une page, je souhaite également récupérer les autres versions de cette page. Ainsi, je pourrais afficher des liens pour les versions dans les autres langues.
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 AspyctPage: actAs: Timestampable: ~ I18n: fields: [title, header, contents] actAs: Sluggable: fields: [title] uniqueBy: [lang, title] columns: category_id: { type: integer, notnull: true } title: { type: string(255), notnull: true } active: { type: boolean, notnull: true, default: 0 } highlight: { type: boolean, notnull: true, default: 0 } header: { type: string(500), notnull: true } contents: { type: string(4000), notnull: true } relations: AspyctCategory: onDelete: CASCADE local: category_id foreign: id foreignAlias: AspyctPages
Pas très difficile en soi, un petit join et c'est réglé.
Seulement voila, Doctrine ne semble pas être du même avis que moi. Et pour cause: malgré que MySQL me retourne 3 tuples quand j'exécute cette requête (ce qui est conforme à mes attentes), Doctrine refuse de m'en sortir plus d'un.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public function getPageGroup($id) { $q = $this->createQuery('p') ->leftJoin('p.Translation t') ->where('p.active = true') ->where('p.id = ?', $id); return $q->execute(); }
La requête générée est celle-ci (notez au passage que le p.active = true est purement et simplement supprimé... )
Fait étonnant: selon la culture actuelle sélectionnée, Doctrine me sort la page "adéquate", en évitant allègrement les deux autres... Je devine donc qu'il me fait une sorte de tri sélectif.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT (...) FROM aspyct_page a LEFT JOIN aspyct_page_translation a2 ON a.id = a2.id WHERE (a.id = '1')
Et quand je veux faire un count, il me rajoute un group by sur... aspyct_page.idCa fausse évidemment le résultat.
Alors... je comprends et respecte son point de vue, mais... comment puis-je obtenir mes 3 pages et imposer mon p.active = true? Je voudrais bien sur ne pas avoir à mettre les mains dans du SQL pur, ce qui me forcerait à créer des objets moi-même (tiens, ça rend paresseux de développer...). Non, enfin, par clarté du code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT COUNT(*) AS num_results FROM ( SELECT a.id FROM aspyct_page a LEFT JOIN aspyct_page_translation a2 ON a.id = a2.id WHERE a.id = '1' GROUP BY a.id ) dctrn_count_query![]()
Partager