Bonjour, je suis nouveau sur le forum et sur cakephp.
J'ai entamé le développement d'un portfolio et j'ai une requête a priori très simple, mais que je n'arrive pas à solutionner.
Alors voila j'ai une table projet avec des enregistrements et un certain nombre de champs ( titre, description, type, client … et année)
Je recherche à afficher dans ma view une liste des enregistrements triés par année avec un titre ( l'année) pour séparer chaque série de projets de la même année.
Ex
2010
Titre_du_projet_1 sa description etc son client
Titre_du_projet_5 sa description etc
Titre_du_projet_8 sa description etc
2009
Titre_du_projet_6 sa description etc
Titre_du_projet_2 sa description etc
Titre_du_projet_7 sa description etc
2007
…
…
…
…
2003
…
Voila, j'espère que quelqu'un pourra m'aider, par ailleurs j'espère que la solution me permettra de faire la même chose, mais par type cette fois.
Merci d'avance pour votre aide.
Après ton find fait juste
$annees = Set::combine($annees,'{n}.Projet.id','{n}.Projet','{n}.Projet.annee');
Puis fait ton set()
Petite précision sur la réponse apporté par Grafikart. Ton find doit se faire sans le 'group', qui te limite en effet comme tu l'as dit, à un seul résultat par année.
Le 'combine' va te permettre d'obtenir ton tableau $annees sous la forme qui suit et d'annuler la redondance du champ 'annee' :
Array(
[Projet.annee] => Array(
[Projet.id] => Array(
[Projet.id] => id_du_projet
[Projet.titre] => titre_du_projet
[Projet.soustitre] => soustitre_du_projet
),
[Projet.id] => Array(
[Projet.id] => id_du_projet
[Projet.titre] => titre_du_projet
[Projet.soustitre] => soustitre_du_projet
)
),
[Projet.annee] => Array (...)
)
En espérant que cela t'aidera.
avec un group by ? apres il faut formater le résultat mais je ne sais pas comment il le serait (le resultat) donc à toi de voir
le group by n'est peut etre pas LA solution, c'est la plus évidente que j'ai trouvée
Alors sauf erreur de ma part le group by ne me retourne qu'un seul enregistrement par année. Alors que j'ai plusieurs enregistrements qui portent la même année.
J'avais pensé d'abord de faire une requête find Group BY pour trouver les années et une requête pour trouver les enregistrements par année ( grâce à ma première requête) et d'enregistrer tout cela dans un tableau imbriqué. Mais je ne sais comment procéder.
Voilà mon contrôleur goupby peut-être que je le paramètre mal ?
$annees = $this->Projet->find('all',array
(
'group' => array('Projet.annee'), // champs pour le GROUP BY ));
$this->set('annees', $annees);
et voici le résulta
Array (
[0] => Array (
[Projet] => Array (
[id] => 2 [titre] => Commodo [sous_titre] => Bibendum Aenean Ipsum [lieu] => Justo [montant_des_travaux] => 3 665 000 € [mandataire] => Ipsum [partenaire] => Amet Lorem Pellentesque Vestibulum [description] => Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nulla vitae elit libero, a [annee] => 2002 [maitre_d_ouvrage] => Ville machin [programation] => Aménagement urbain )
)
[1] => Array (
[Projet] => Array (
[id] => 1 [titre] => Le super projet [sous_titre] => qui est vraimen bien [lieu] => La ville [montant_des_travaux] => 2 640 000 € [mandataire] => Nous evidement [partenaire] => Il sont nombreux et pas tous trop cool [description] => Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
[annee] => 2003 [maitre_d_ouvrage] => Ville de bandol [programation] => Ecole )
)
[2] => Array (
[Projet] => Array (
[id] => 3 [titre] => Le super projet [sous_titre] => qui est vraimen bien [lieu] => La ville [montant_des_travaux] => 2 640 000 € [mandataire] => Nous evidement [partenaire] => Il sont nombreux et pas tous trop cool [description] => Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
[description_courte] => Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.
[annee] => 2005 [maitre_d_ouvrage] => Toc Promotion [programation] => Logements )
)
)
Ma solution :
une fois que tu as $annees tu fais :
$annees = Set::combine($annees,'{n}.Projet.id','{n}.Projet','{n}.Projet.annee');
Ca fait peur au début mais combine permet de réorganiser des tableau facilement.
Alors je ne suis pas sure de comprendre ? J'ai regarder dans le cookbook mais je n'arrive pas à bien saisir de quel manière cela va m'aider
J'aimerai pourvoir obtenir une variable dont je puisse me servie de cette manière dans la vue
<?php foreach ($annees as $annee): ?>
<div class="bloc_about"><h2> + <?php echo $annee'Projet']'annee']; ?></h2></div>
<?php foreach ($projets as $projet):?>
<div class="bloc_projet">
<p style="projet"><span class="titre_projet"><?php echo $projet'Projet']'titre']; ?></span>
<span class="sous_titre_projet"> // <?php echo $projet'Projet']'sous_titre']; ?></span> -
<span class="maitredouvrage_projet"><?php echo $projet'Projet']'maitre_d_ouvrage']; ?></span> -
<span class="anne_projet"><?php echo $projet'Projet']'annee']; ?></span> -
<span class="type_projet"><?php echo $projet'Projet']'programation']; ?></span> -
<span class="descriptif_projet"><?php echo $projet'Projet']'description_courte']; ?></span> -
<span class="montant_projet"><?php echo $projet'Projet']'montant_des_travaux']; ?></span>
</p>
</div>
<p class="control_db">
<?php echo $this->Html->link( 'editer', array("controller" => "projets","action" => "edit", $projet'Projet']'id']));?>
<?php echo $this->Html->link( 'supprimer', array("controller" => "projets","action" => "delete", $projet'Projet']'id']));?>
</p>
<?php endforeach; ?>
<?php endforeach; ?>
Merci pour votre patience
Merci j'ai eu un peu de mal à mettre en forme cet array, n'ayant pas l'habitude, mais merci je suis parvenu à mes fins.
Set combine : et une fonction très pratique.
À bientôt