Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 02-02-2011 00:41:30

ib.bakayoko
Nouveau membre
Date d'inscription: 11-11-2009
Messages: 1

Pb avec joinLeft ZF 1.11.2

Salut,

J'ai beoin d'aide je souhaite faire un joinLeft avec ZF mais sa ne marche pas.

La fonction que j'ai ds mon modele

    public function getDetailActions($dossier_id,$etape,$user_id){
       
        $select = $this->select();
        $select->from('dossier', array('*','dateAjout' =>"DATE_FORMAT(dateAdd,'%d.%m.%Y')",'dateDebut' =>"DATE_FORMAT(dateBegin,'%d.%m.%Y')",'dateFin' =>"DATE_FORMAT(dateEnd,'%d.%m.%Y')"));
        //->joinLeft('agence','idagence = agence_idagence' ,array('nomAgceEmis'=>'nom'))
        $select->joinLeft('actions','dossier.id=dossier_id',array());
        $select->where('dossier.id = ?', $dossier_id);
        $select->where('etape = ?', $etape);
        $select->where('user_id = ?', $user_id);       

        //var_dump($select->assemble());
       
        $infoDossier = $this->fetchRow($select);       
       
        return $infoDossier;
    }

Cette function marche bien.

Mais quand je veux retourner les elements ou un element de la table a droite du join (actions) j'ai une erreur, je n'arrive pas a debugger et ne sais pas a koi c'est du.

Structure de mes 2 tables:

CREATE TABLE IF NOT EXISTS `actions` (
  `id` int(11) NOT NULL auto_increment,
  `commentaire` text NOT NULL,
  `decision` varchar(45) default NULL,
  `budget` float default NULL,
  `dateAvis` timestamp NULL default NULL,
  `datePub` timestamp NULL default NULL,
  `user_id` int(11) NOT NULL,
  `dossier_id` bigint(20) NOT NULL,
  PRIMARY KEY  (`id`,`user_id`,`dossier_id`),
  KEY `fk_actions_user` (`user_id`),
  KEY `fk_actions_dossier1` (`dossier_id`),
  KEY `critere` (`decision`,`dateAvis`,`datePub`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

CREATE TABLE IF NOT EXISTS `dossier` (
  `id` bigint(20) NOT NULL auto_increment,
  `nom` varchar(200) NOT NULL,
  `email` varchar(100) NOT NULL,
  `phone` varchar(45) NOT NULL,
  `ville` varchar(45) NOT NULL,
  `titreEvt` varchar(45) NOT NULL,
  `dateBegin` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `dateEnd` timestamp NOT NULL default '0000-00-00 00:00:00',
  `axe` enum('Sport','Culture','Evènementiel','Mécénat','RSE','Divers') NOT NULL,
  `budget` float NOT NULL,
  `region` varchar(45) NOT NULL,
  `commentaire` text,
  `files` text NOT NULL,
  `etape` tinyint(4) NOT NULL default '0',
  `dateAdd` timestamp NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`),
  KEY `search` (`etape`,`region`,`dateBegin`,`dateEnd`,`dateAdd`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

J'ai une erreur kan je j'utilise la function ci dessous:

    public function getDetailActions($dossier_id,$etape,$user_id){
       
        $select = $this->select();
        $select->from('dossier', array('*','dateAjout' =>"DATE_FORMAT(dateAdd,'%d.%m.%Y')",'dateDebut' =>"DATE_FORMAT(dateBegin,'%d.%m.%Y')",'dateFin' =>"DATE_FORMAT(dateEnd,'%d.%m.%Y')"));
        //->joinLeft('agence','idagence = agence_idagence' ,array('nomAgceEmis'=>'nom'))
        $select->joinLeft('actions','dossier.id=dossier_id',array('decision','budget'));
        $select->where('dossier.id = ?', $dossier_id);
        $select->where('etape = ?', $etape);
        $select->where('user_id = ?', $user_id);       

        //var_dump($select->assemble());
       
        $infoDossier = $this->fetchRow($select);       
       
        return $infoDossier;
    }

// la difference entre les deux fonctions est array() --> champs deuxieme table.

Merci de m'aider

Hors ligne

 

#2 08-02-2011 10:02:45

CinePhil
Membre
Date d'inscription: 24-03-2010
Messages: 19

Re: Pb avec joinLeft ZF 1.11.2

Comme user_id est une colonne de la table action qui est à droite du LEFT JOIN, ta jointure externe revient à faire une jointure interne. Voir explication sur mon blog chez developpez.com.

Maintenant je ne sais pas si ton problème est dû à ça.
Perso, je n'utilise pas cette méthode compliquée pour écrire les requêtes SQL dès que ça dépasse le simple fetch sur une condition et une seule table. Je les écris en SQL natif.
Exemple :

Code:

    public function getEtablissementParNom($nom)
    {
        $sql = "
            SELECT e.etb_id, e.etb_nom, e.etb_adresse, e.etb_code_postal, e.etb_telephone, 
                c.cmn_nom,
                te.te_libelle 
            FROM te_etablissement_etb e 
            INNER JOIN tr_commune_cmn c ON c.cmn_id = e.etb_id_commune 
            INNER JOIN tr_type_etablissement_te te ON te.te_id = e.etb_id_type_etablissement 
            WHERE e.etb_nom = :nom 
        ";
        
        return $this->_db->fetchRow($sql, $nom);

C'est beaucoup plus rapide à écrire et plus facile à tester hors ZF.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages