Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Zend et requête affichage count et group by


Sujet :

Zend_Db PHP

  1. #1
    Membre à l'essai
    Zend et requête affichage count et group by
    Salut a tous =)
    Voila il se trouve que j'ai encore un problème avec Zend, cela ne fait que quelques semaines (quelques heures surtout) que je suis dessus,
    et j'ai un problème avec l'affichage d'une requête, voici ma requête :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    select count(abonnement_type_id) as count from abonnements group by abonnement_type_id


    Voici ensuite mon code :
    Le controller : AbonnementsController.php
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    public function statistiqueschiffreaffaireAction()
        {    	
        	$abonnementsTable=new Application_Model_DbTable_Abonnements();
        	$select= $abonnementsTable->select()
        	->from(array('p'=>'abonnements'),array('somme'=>'COUNT(abonnement_type_id)')); 
        	$this->view->stats_chiffreaffaires = $abonnementsTable->fetchAll($abonnementsTable->select()); 	
     
        }


    La views statistiqueschiffreaffaire.phtml
    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
     
    <?php
    $this->layout()->setLayout('administration/admin'); 
     
    ?>
    <br/><br/>
    <table>
        <tr>
            <th>Titreokkkkk</th>
            <th>&nbsp;</th>
        </tr>
    <?php foreach($this->stats_chiffreaffaires as $stat_chiffreaffaire) : ?>
        <tr>
            <td><?php echo $this->escape($stat_chiffreaffaire->abonnement_type_id);?></td>
        </tr>
    <?php endforeach; ?>
    </table>


    Et le model, mais je pense que le problème de viens pas de d'ici:
    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
    23
    24
    25
     
    <?php
     
    class Application_Model_DbTable_Abonnements extends Zend_Db_Table_Abstract
    {
    	protected $_name = 'abonnements';
    	protected $_primary = array('id');
    	protected $_sequence = 'abonnements_abo_id_seq';
     
    	 protected $_referenceMap    = array(
            'abonnements_types' => array(
                'columns'           => array('abonnement_type_id'),
                'refTableClass'     => 'Application_Model_DbTable_AbonnementsTypes',
                'refColumns'        => array('id'),
            		'onDelete'          => self::RESTRICT,
            		'onUpdate'          => self::RESTRICT),
    	 	'prestataires' => array(
     			'columns'	=> array('pre_id'),
     			'refTableClass' => 'Application_Model_DbTable_Prestataires',
    	 		'refColumns'	=> array('id'),
    	 			'onDelete'          => self::CASCADE,
    	 			'onUpdate'          => self::RESTRICT));
     
     
    }


    Je vous ai mit un code qui affiche quelque chose plutôt que l'erreur. Mais ce code affiche l'ensemble de mes abonnements et moi j'aimerais afficher le nombre d'abonnement en fonction en fonction du type d'abonnement(group by abonnement_type_id)

    Pour être encore un peu plus clair, voila ce que j'ai en ce moment :
    abonnement_type_id
             1
             1
             3
             3
             2
             3
             3
    et j'aimerais ça :
    abonnement_type_id	count
             1	          2
             2	          1
             3	          4
    Voila je pense que cela est pas compliqué, j'arrive à le faire avec la requête mais l'afficher avec le "langage" Zend j'y arrive pas.
    Merci de votre aide =)
    ++

  2. #2
    Membre habitué
    J'aurais fait un truc du genre

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    return $this->fetchAll(
        $this->select()
        ->from($this, COUNT(abonnement_type_id) as count)
        ->group(abonnement_type_id)
    );


    Enfin il faudrait que tu passes par ton model pour créer tes requêtes du genre

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function getAllAbonnementByType() {
    return $this->fetchAll(
        $this->select()
        ->from($this, COUNT(abonnement_type_id) as count)
        ->group(abonnement_type_id)
    );
    }


    et ensuite dans ton controller

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    $model = new Model();
    $requete = $model->getAllAbonnementByType();


    Ce serait plus propre

  3. #3
    Membre du Club
    Bonjour,

    Comme signalé par mon VDD, je te recommande l'usage du ZQL fourni par Zend. Cela ne veut pas un ORM mais ça a l'avantage d'être relativement flexible et simple à mettre en place sans compter que la plupart des données sont échappées.

    En revanche, là où je reste perplexe, c'est ici :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    select count(abonnement_type_id) as count from abonnements group by abonnement_type_id


    Je ne suis pas un pro du SQL et je n'ai nullement la science infuse néanmoins je trouve étrange de rajouter une clause group by sur un champ qui n'est pas dans le SELECT. De plus, par convention, j'éviterais de nommer mon alias "count" puisqu'il s'agit d'un mot clé réservé par SQL ; histoire d'éviter des conflits

    Il faudrait également que tu rajoutes dans ta requête la colonne souhaitée, à savoir abonnement_type_id. A partir de là, ta requête devrait plus ressembler à :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    SELECT abonnement_type_id,count(abonnement_type_id) AS nbAboType FROM abonnements GROUP BY abonnement_type_id


    Ainsi, tu profiterais de ta clause GROUP BY.

    Cordialement

  4. #4
    Membre éprouvé
    bonjour,
    je souscris à tout ce qui vient d'être enoncé par @Cr3a_Hal0 que la colonne spécifiée dans la clause group by doit systématiquement figurer dans le select.

    Partant de la requête suivante:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    SELECT abonnement_type_id,count(abonnement_type_id) AS nbAboType FROM abonnements GROUP BY abonnement_type_id

    La traduction de cette requête en ZF est la suivante:

    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
     
     
    <?php
    public function statistiqueschiffreaffaireAction()
        {    	
        	$abonnementsTable=new Application_Model_DbTable_Abonnements();
        	$select= $abonnementsTable->select()
        	->from(array('p'=>'abonnements'),array('abonnement_type_id','somme'=>'count(abonnement_type_id)'))->group('abonnement_type_id'); 
    /*
    requête sql générée:
    echo $select->__toString();
    */
        	$this->view->stats_chiffreaffaires = $abonnementsTable->fetchAll($select); 	
     
        }

    il est touttefois possible de voir la requête SQL générée en faisant un echo $select(voir commentaire)

###raw>template_hook.ano_emploi###