Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Débutant avec Zend, j'aimerais requérir votre aide pour un petit problème.
Situation:
-----------
2 tables:
-Utilisateur: id,non,mail,cat_id(fk)
-Categorie: id,cat;
Ma requête afin d'afficher le nom,catégorie d'un utilisateur.
$select = $this->select() ->setIntegrityCheck(FALSE) ->from(array('u'=>'utilisateurs')) ->join (array('c'=>'categorie'),'u.cat_id=c.id',array('Categorie'=>'c.cat')) ->order('u.non ASC'); return $this->fetchAll($select); [0] => array(5) { ["id"] => string(1) "4" ["non"] => string(3) "ced" ["mail"] => string(12) "ced@mail.com" ["cat_id"] => string(1) "2" ["Categorie"] => string(8) "Employer" } [1] => array(5) { ["id"] => string(1) "1" ["non"] => string(10) "Christophe" ["mail"] => string(19) "christophe@mail.com" ["cat_id"] => string(1) "2" ["Categorie"] => string(8) "Employer" } [2] => array(5) { ["id"] => string(1) "5" ["non"] => string(7) "Pasqual" ["mail"] => string(16) "pasqual@mail.com" ["cat_id"] => string(1) "3" ["Categorie"] => string(7) "Ouvrier" } [3] => array(5) { ["id"] => string(1) "2" ["non"] => string(4) "tanh" ["mail"] => string(13) "tanh@mail.com" ["cat_id"] => string(1) "3" ["Categorie"] => string(7) "Ouvrier" } [4] => array(5) { ["id"] => string(1) "3" ["non"] => string(4) "ziad" ["mail"] => string(13) "ziad@mail.com" ["cat_id"] => string(1) "2" ["Categorie"] => string(8) "Employer" } }
et mon but est de devoir afficher tout ca comme ca:
* Catégorie1
o Nom1
o Nom2
* Categorie2
o Nom3
o Nom4
pour le moment j'arrive à ce résultat la:
<?php foreach ($this->utilisateurs as $utilisateur):?> <ul> <li><?php echo $utilisateur->Categorie; ?></li> <ul> <li><?php echo $utilisateur->non; ?></li> </ul> </ul> <?php endforeach;?>
* Catégorie1
o Nom1
* Catégorie1
o Nom2
* Categorie2
o Nom3
* Categorie2
o Nom4
Si quelqu'un a une petite idée sur comment faire pour arrivé au bon résultat, je suis preneur, merci d'avance.
ps: désolé de ce long poste et ne sachant pas ou le mettre je l'ai mit dans cette section, il faudra peut être le déplace si le post ne correspond pas a cette section.
Hors ligne
Euh... La requête SQL n'est peut être pas bonne, faudrait voir un group By peut être...
Sinon pour faire simple, tu peux mettre :
[lang=php] <?php $cat = null; foreach ($this->utilisateurs as $utilisateur): if($cat == null or $cat != $utilisateur->Categorie) echo '<ul><li>'.$utilisateur->Categorie.'</li><ul>'; echo '<li>'.$utilisateur->non.'</li>'; if($cat == null or $cat != $utilisateur->Categorie) echo '</ul></ul>'; $cat = $utilisateur->Categorie; endforeach; ?>
Ou un truc dans ce goût, j'ai pas testé ce code spécifiquement... Par contre c'est sur sale... Pas de séparation données / vue etc, etc...
Hors ligne
J'ai tester un group by "->croup(c.cat);" et il me donne les catégorie ok mais que 1 nom par catégorie alors qu'il y en a plus que ca de nom par catégorie
Hors ligne
Pourrais-tu poster le résultat d'un Zend_Debug::var($resultat_du_select); ?
Hors ligne
Je parlais d'un dump de la requête avec le group by en fait (j'avais déjà vu l'autre, mais la seule solution exploitable à partir de ce résultat de BD est un truc dans le goût de ce que je t'ai mis plus haut).
Hors ligne
Ah ok désolé, je te met le résultat de selecte avec le groupby, je regroupe le tout avec le nom de la catégorie. Avec ce résultat la, il me manque des personnes.
$select = $this->select() ->distinct() ->setIntegrityCheck(FALSE) ->from(array('u'=>'utilisateurs')) ->join(array('c'=>'categorie'),'u.cat_id=c.id',array('Categorie'=>'c.cat')) ->order('u.non ASC') ->group('c.cat'); return $this->fetchAll($select); object(Zend_Db_Table_Rowset)#50 (10) { ["_data":protected] => array(2) { [0] => array(5) { ["id"] => string(1) "1" ["non"] => string(10) "Christophe" ["mail"] => string(19) "christophe@mail.com" ["cat_id"] => string(1) "2" ["Categorie"] => string(8) "Employer" } [1] => array(5) { ["id"] => string(1) "2" ["non"] => string(4) "tanh" ["mail"] => string(13) "tanh@mail.com" ["cat_id"] => string(1) "3" ["Categorie"] => string(7) "Ouvrier" } }
Dernière modification par shad797 (08-04-2011 11:49:53)
Hors ligne
Ok j'ai remodelé ma requête et j'ai trié le tout par le nom des Catégories et par le nom des utilisateurs (oui je dois avoir les utilisateurs par ordre alphab)
Avec le tri par Catégorie, le code que tu ma passé fonction, voila le résultat brut
$select = $this->select() ->setIntegrityCheck(FALSE) ->from(array('u'=>'utilisateurs')) ->join(array('c'=>'categorie'),'u.cat_id=c.id',array('Categorie'=>'c.cat')) //->group('u.non') ->order('c.cat ASC') ->order('u.non ASC'); L'affichage * Employer o ced # Christophe # ziad * Ouvrier o Pasqual # tanh
Maintenant j'ai juste à ajouter 2-3 trucs pour la présentation
Dernière modification par shad797 (08-04-2011 15:23:15)
Hors ligne
Pour ceux à qui sa intéresse voila la solution complète qui fonctionne
Je sélectionne tout les utilisateurs ainsi que leur catégories et je les trie par nom et catégorie
[lang=sql]$select = $this->select() ->setIntegrityCheck(FALSE) ->from(array('u'=>'utilisateurs')) ->join(array('c'=>'categorie'),'u.cat_id=c.id',array('Categorie'=>'c.cat')) ->order('c.cat ASC') ->order('u.non ASC');
l'affichage
[lang=phtml]<ul> <?php $cat = null; foreach ($this->utilisateurs as $utilisateur) { if($cat == null) { ?> <li><?php echo $utilisateur->Categorie;?></li> <ul> <li><?php echo $utilisateur->non;?></li> <?php $cat = $utilisateur->Categorie; } elseif ($cat == $utilisateur->Categorie) { ?> <li><?php echo $utilisateur->non;?></li> <?php } else { ?> </ul> <li><?php echo $utilisateur->Categorie;?></li> <ul> <li><?php echo $utilisateur->Categorie;?></li> <?php $cat=$utilisateur->Categorie; } } ?> </ul></ul>
qui donne bien
* Employer
o ced
o Christophe
o ziad
* Ouvrier
o Ouvrier
o tanh
Hors ligne