[Doctrine] Je veux mes trois tuples !
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:
Code:
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 |
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.
Pas très difficile en soi, un petit join et c'est réglé.
Code:
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();
} |
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.
La requête générée est celle-ci (notez au passage que le p.active = true est purement et simplement supprimé... )
Code:
1 2
| SELECT (...) FROM aspyct_page a
LEFT JOIN aspyct_page_translation a2 ON a.id = a2.id WHERE (a.id = '1') |
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.
Et quand je veux faire un count, il me rajoute un group by sur... aspyct_page.id :( Ca fausse évidemment le résultat.
Code:
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 |
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 8-)