PDO::FETCH_GROUP - COSMETIQUE PHP
Bonjour,
J'ai la requête sql suivante qui affiche des livres :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
$query = $pdo->query("SELECT o.oeuvre_titre, o.oeuvre_id,g.genre_nom,o.oeuvre_titre
FROM oeuvre o
INNER JOIN figurer f
ON o.oeuvre_id = f.fk_oeuvre_id
INNER JOIN edition ed
ON ed.edition_id = f.fk_edition_id
INNER JOIN thematiser th
ON o.oeuvre_id = th.fk_oeuvre_id
INNER JOIN genre g
ON g.genre_id = th.fk_genre_id
INNER JOIN exemplaire ex
ON ed.edition_id = ex.fk_edition_id"); |
Pour gérer l'affichage de cette requête (un livre pouvant avoir plusieurs genres), je regroupe la liste de livres par titre grâce à PDO::FETCH_GROUP :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
$result = $query->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
echo'<pre>';
print_r($result);
echo'<pre>';
foreach ($result as $titre => $values) {
printf('<h1>%s</h1>', $titre);
echo '<ul>';
foreach ($values as $u) {
echo '<li>'.$u['genre_nom'].'</li>';
}
} |
Ce qui donne l'affichage suivant (conforme à mes attentes) :
Code:
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
|
Array
(
[Le proscrit] => Array
(
[0] => Array
(
[oeuvre_id] => 1
[genre_nom] => thriller
[oeuvre_titre] => Le proscrit
)
[1] => Array
(
[oeuvre_id] => 1
[genre_nom] => science fiction
[oeuvre_titre] => Le proscrit
)
)
)
Le proscrit
thriller
science fiction |
Là où ça se corse, c'est qu'un livre peut aussi (outre avoir plusieurs genres) être classé en plusieurs catégories (roman, documentaire...).
A ma requête, je rajoute donc une jointure du style :
Code:
1 2 3 4 5
|
INNER JOIN classifier cl
ON o.oeuvre_id = cl.fk_oeuvre_id
INNER JOIN categorie c
ON c.categorie_id = cl.fk_categorie_id |
Le problème est que l'affichage comporte alors des "doublons d'affichage" (exemple pour un livre ayant 2 genres et 3 catégories) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
foreach ($result as $titre => $values) {
printf('<h1>%s</h1>', $titre);
echo '<ul>';
foreach ($values as $u) {
echo '<li>'.$u['categorie_nom'].'</li>';
echo '<li>'.$u['genre_nom'].'</li>';
}
} |
Code:
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
Array
(
[Le proscrit] => Array
(
[0] => Array
(
[oeuvre_id] => 1
[genre_nom] => thriller
[oeuvre_titre] => Le proscrit
[categorie_nom] => roman
)
[1] => Array
(
[oeuvre_id] => 1
[genre_nom] => thriller
[oeuvre_titre] => Le proscrit
[categorie_nom] => documentaire
)
[2] => Array
(
[oeuvre_id] => 1
[genre_nom] => thriller
[oeuvre_titre] => Le proscrit
[categorie_nom] => ouvrage de référence
)
[3] => Array
(
[oeuvre_id] => 1
[genre_nom] => science fiction
[oeuvre_titre] => Le proscrit
[categorie_nom] => roman
)
[4] => Array
(
[oeuvre_id] => 1
[genre_nom] => science fiction
[oeuvre_titre] => Le proscrit
[categorie_nom] => documentaire
)
[5] => Array
(
[oeuvre_id] => 1
[genre_nom] => science fiction
[oeuvre_titre] => Le proscrit
[categorie_nom] => ouvrage de référence
)
)
)
Le proscrit
roman
thriller
documentaire
thriller
ouvrage de référence
thriller
roman
science fiction
documentaire
science fiction
ouvrage de référence
science fiction |
L'affichage que je voudrais obtenir étant plutôt le suivant :
Code:
1 2 3 4 5 6 7
|
Le proscrit
roman
documentaire
ouvrage de référence
thriller
science fiction |
Voyez-vous comment parvenir à l'affichage souhaité ? Merci.