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 :

Requete Join complexe [ZF 1.8]


Sujet :

Zend_Db PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Requete Join complexe
    Salut,

    je cherche à reproduire la requete suivante dans le "model" de la table CE mais sans trop de succes pour le moment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT CE . *
    FROM CE
    JOIN (
    SELECT etudiant_id, periode_id, max( ce_version ) AS versionmax
    FROM CE
    GROUP BY etudiant_id, periode_id
    )CEMAX ON CE.etudiant_id = CEMAX.etudiant_id
    WHERE CE.periode_id = CEMAX.periode_id
    AND CE.ce_version = CEMAX.versionmax
    AND CE.etudiant_id = "1"
    ORDER BY `CE`.`ce_version` DESC
    si quelqu'un a une idee, elle sera la bienvenue

    Ced.

  2. #2
    Invité
    Invité(e)
    Par défaut
    j'ai recu de l'aide sur un autre forum et j'en suis arrive a ca :

    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
    $max = $this->select()
    			->from($this, array(
    				'etudiant_id', 
    				'periode_id', 
    				'versionmax' => 'max(ce_version)'))
    			->where('etudiant_id = "'.$etudiant.'"')
    			->group(array('etudiant_id', 'periode_id'));
     
    $select = $this->select()->setIntegrityCheck(false);
    				$select->from(array('CE' => $this))
    				->join(
    						array('CEMAX'=> $max), 
    						'etudiant_id = CEMAX.etudiant_id',
    						array()
    					)
    				->where('CE.etudiant_id = 1 and CE.periode_id = CEMAX.periode_id AND CE.ce_version = CEMAX.versionmax')
    				->order('ce_version', 'DESC');
     
    $result = $this->fetchAll($select)->toArray();
    Désormais j'ai une erreur "serveur" :

    Fatal error: Uncaught exception 'Zend_Db_Table_Select_Exception' with message 'Select query cannot join with another table'

    j'ai vu q il faudrait instancier les variables " $_dependantTables " et " $_referenceMap "
    ainsi qu'appliquer la methode " setIntegrityCheck(false) "

    mais quand c'est fait, ca me renvoie une autre erreur :

    Catchable fatal error: Object of class Ce could not be converted to string in C:\www\si\library\Zend\Db\Adapter\Abstract.php on line 958

  3. #3
    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,

    $this étant un objet de classe Zend_Db_Table, $this->select() est un objet de type Zend_Db_Table_Select. Or un Zend_Db_Table_Select ne peut pas renvoyer des données qui ne sont pas dans la table principale ('CE' dans ton cas). Il faut donc utiliser un Zend_Db_Select à la place.

    Je te propose de modifier ta construction de requête comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $max = $this->getAdapter()->select()
        ->from($this->_name,
               array('etudiant_id',
                     'periode_id',
                     'versionmax' => 'max(ce_version)'))
        ->group(array('etudiant_id', 'periode_id'));
    $select = $this->select()
        ->from($this)
        ->join(array('CEMAX' => $max),
                     'CE.etudiant_id = CEMAX.etudiant_id and CE.periode_id = CEMAX.periode_id AND CE.ce_version = CEMAX.versionmax',
                     array())
        ->where('CE.etudiant_id = ?', $etudiant)
        ->order('ce_version', 'DESC');

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup Eusebe

    Je crois avoir maintenant compris ce qui n'allait pas

    Merci

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 14
    Par défaut
    Bonjour!

    J'ai eu le même problème ce matin!

    Effectivement setIntegrityCheck() mis à 'false' a résolu mon problème.

    Je n'ai cependant pas eu besoin de spécifier la referenceMap ni les dependantTables !

    En fait, j'ai ma requête formulée à l'aide d'un objet Select dans le fetchAll() d'un objet Zend_Db_Table.

    Il s'agit d'une fonction membre de mon objet héritant de Zend_Db_Table_Abstract

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    public function getDataAndReplies()
    {
     
    	return $this->fetchAll($this->select()->from()[...]->setIntegrityCheck(false));
     
    }
    Ma jointure est faite sur une autre table et je récupère un nombre de réponse (un COUNT(*) en clair, sur ma table jointe).

    J'ai juste regardé la doc ce matin et je suis tombé sur integrityCheck, fort heureusement car je ne voulais pas sortir du cadre de mon objet, ni m'abstenir de mon objet Row personnalisé!

    Et d'ailleurs la doc m'a indiqué à un endroit que ce n'était clairement pas possible d'obtenir une autre colonne de ma jointure avec mon objet Row, et plus loin m'indique cette fonction de désactivation de l'intégrité! Je comprends qu'on puisse s'embrouiller quelques fois

    Voilà je fais juste part de mon expérience .

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

Discussions similaires

  1. requete sql complexe, que faire: 2 sql imbriques ou fonction date?
    Par Aliveli dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/06/2006, 20h20
  2. Requete SQL complexe
    Par isa21493 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/02/2006, 16h43
  3. Requete sql complexe
    Par ekinoxe dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 11/01/2006, 16h16
  4. Err. 3360 , 'Requete trop complexe'
    Par fabrice518 dans le forum Access
    Réponses: 4
    Dernier message: 18/11/2005, 14h43
  5. Réponses: 5
    Dernier message: 04/08/2003, 21h50

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