IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Jointure avec Zend_Db_Table [ZF 1.7]


Sujet :

Zend_Db PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Par défaut Jointure avec Zend_Db_Table
    Je commence dans l'utilisation de Zend_Framework

    Voila je souhaite faire une sélection par jointure, je me heurte a plusieurs problèmes.

    premier problème : Génération du select

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $lignes = new Lignes(); // Zend_Db_Table;
    $select = $lignes->select("COUNT(COTATION), SUM(COTATION), COUNT(TEMPS), SUM(TEMPS) ")
    								->from('df_ligne')
    								->join('df_dossier', 'df_dossier.ID = df_ligne.REF_DOSSIER')								
    								->where($where)
    								->group(array('MISSION','CATEGORIE'));
    $dbresult = $lignes->fetchAll($select);
    lors de l'execution j'ai l'erreur : Uncaught exception 'Zend_Db_Table_Select_Exception' with message 'Select query cannot join with another table'
    Il me semble pourtant que ce genre de requête est autorisé...


    Pour contourner dans un premier temps l'erreur je génère ma requête comme un grand (requête qui fonctionne biensur)

    et la patatra : Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)'

    la je commence a dire que Zend ne m'aime pas :'( pour le moment ça avait l'air super mais si ce genre de truc simple n'est pas possible ça va pas aller bien loin.

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    D'où es-tu parti pour créer ton code ?

    Tu utilises la méthode Select d'un Zend_Db_Table. Cette méthode ne prend aucun paramètre. Et cela crée un objet Zend_Db_Table_Select qui ne peut renvoyer que des colonnes de la table d'origine.

    Si tu veux faire une requête complexe, le plus simple est en général de partir d'un objet Zend_Db_Select. Son constructeur prend en paramètre ton adaptateur de base de données.

    Par exemple (non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $select = new Zend_Db_Select($db);
    $select->from(array('l' => 'df_ligne'), array('cot_c' => 'COUNT(COTATION)',
            'cot_s' => 'SUM(COTATION)',
            'tps_c' => 'COUNT(TEMPS)',
            'tps_s' => 'SUM(TEMPS)'))
        ->join(array('d' => 'df_dossier'), 'd.ID = l.REF_DOSSIER', array())
        ->where($where)
        ->group(array('MISSION', 'CATEGORIE'));
    Dans cette requête, j'ai considéré que les colonnes COTATION et TEMPS appartiennent à la table df_ligne. Si ce n'est pas le cas, il faut les mettre en troisième paramètre de la méthode join.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tu utilises la méthode Select d'un Zend_Db_Table. Cette méthode ne prend aucun paramètre. Et cela crée un objet Zend_Db_Table_Select qui ne peut renvoyer que des colonnes de la table d'origine.
    Autant pour moi, merci de cette précision. Cela parait logique, il me semble avoir essayer avec un Zend_db_Select mais sans succes.
    En tout cas ta solution marche, merci beaucoup.

    Un dernier point pour m'eclairer sur la construction dynamique, voici mon code :

    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
     
    		$select = new Zend_Db_Select($db);		
     
    		$select->from(array('l' => 'df_ligne'), array('cot_c' => 'COUNT(COTATION)',
    			        'cot_s' => 'SUM(COTATION)',
    			        'tps_c' => 'COUNT(TEMPS)',
    			        'tps_s' => 'SUM(TEMPS)',
    					'MISSION','REF_CATEGORIE'));
    		$select->join(array('d' => 'df_dossier'), 'd.ID = l.REF_DOSSIER', array());		
     
    		if (isset($_POST['FormeJuridique'])) $select->where('d.FORME_JURIDIQUE = ?', quote($_POST['FormeJuridique']));
    		if (isset($_POST['CodeApe'])) $select->where('d.CODE_APE = ?',quote($_POST['CodeApe']));
    		if (isset($_POST['TenueComptable'])) $select->where('d.TENUE_COMPTABLE = ?',$_POST['TenueComptable']);
    		if (isset($_POST['Departement'])) $select->where('d.DEPARTEMENT = ?',$_POST['Departement']);
    		if (isset($_POST['NbLigneInfoMin'])) $select->where('d.NB_LIGNE_INFO >= ?',$_POST['NbLigneInfoMin']);
    		if (isset($_POST['NbLigneInfoMax'])) $select->where('d.NB_LIGNE_INFO <= ?',$_POST['NbLigneInfoMax']);
    		if (isset($_POST['EffectifMin'])) $select->where('d.EFFECTIF >= ?',$_POST['EffectifMin']);
    		if (isset($_POST['EffectifMax'])) $select->where('d.EFFECTIF <= ?',$_POST['EffectifMax']);
    		$select->group(array('MISSION', 'REF_CATEGORIE'));
    Je n'ai vu qu'une seule construction de la clause where en cas d'arguments multiple :
    ->where(clause1)
    ->where(clause2)

    N'y aurait il pas moyen de construire cette clause where à partir d'un tableau ? (J'ai essayer mais cela n'as pas fonctionner il n'accepte pas les arguments de type tableau (du moins il me semble)

    Merci encore pour l'aide que tu m'as fournis.

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par Caesarus Voir le message
    N'y aurait il pas moyen de construire cette clause where à partir d'un tableau ? (J'ai essayer mais cela n'as pas fonctionner il n'accepte pas les arguments de type tableau (du moins il me semble)
    A ma connaissance ce n'est pas possible.

    Pour info, l'échappement des caractères spéciaux est fait par Zend_Db_Select. Donc il est inutile (et même problématique) de réaliser cet échappement avant de passer les variables à la méthode where...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Par défaut
    A ma connaissance ce n'est pas possible.

    Pour info, l'échappement des caractères spéciaux est fait par Zend_Db_Select. Donc il est inutile (et même problématique) de réaliser cet échappement avant de passer les variables à la méthode where...
    Ok merci pour ces précisions

    Je te remercie pour ces lumières.

    Je passe le sujet en résolu.

  6. #6
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    Je remonte ce sujet certes un peu vieux. Mais quand on execute une recherche sur Zend_Db_Table et Join, c'est ce sujet qui remonte. Alors je préfère poster et améliorer la base de connaissance. Car je trouve que le premier problème n'est pas réellement corrigé. On peut réaliser un join sur un Zend_Db_Table_Select. Il faut pour cela couper les contraintes d'intégrités et filtrer les résultats sur les colonnes de la table initiale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	/**
    	 * Recherche les projets auquel participe un agent
    	 * 
    	 * @param int $id
    	 * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode. 
    	 */
    	public function rechercherPourAgent($id) {
    		$select = $this->select ();
    		$select->joinLeft ( array('a' => 'tj_agents_age'), 'a.pro_id = p.pro_id');
    		$select->where ( 'a.uti_id = ?' , $id );
    		return $this->fetchAll ( $select );
     
    	}
    $this est un objet de type Zend_Db_Table.
    Ce code retourne une erreur qui laisse à penser que c'est impossible :
    Message: Select query cannot join with another table
    Pourtant c'est possible en désactivant le contrôles des contraintes d'intégrités et filtrer les résultats sur les colonnes de la table initiale.

    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
    	/**
    	 * Recherche les projets auquel participe un agent
    	 * 
    	 * @param int $id
    	 * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode. 
    	 */
    	public function rechercherPourAgent($id) {
    		$select = $this->select ();
    		$select->setIntegrityCheck ( false );
    		$select->from ( array('p' => 'te_projet_pro', 'p.*' ));
    		$select->joinLeft ( array('a' => 'tj_agents_age'), 'a.pro_id = p.pro_id');
    		$select->where ( 'a.uti_id = ?' , $id );
    		return $this->fetchAll ( $select );
     
    	}
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. jointure avec 2 id différent pour 1 seul table.
    Par vermo dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 10/11/2005, 15h19
  2. jointure avec clé composée de 2 colonnes
    Par free07 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/10/2005, 07h07
  3. Réponses: 2
    Dernier message: 27/10/2005, 11h15
  4. jointure avec xslt
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/09/2005, 10h48
  5. [SAGE]Jointures avec SGBD
    Par mat.M dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 09/10/2003, 12h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo