Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
C'est mon premier post sur ce forum et vous remercie d'avance pour votre aide.
Dans le site que je développe, j'ai besoin de faire une "triple jointure", à savoir que ma requête travaille sur 3tables.
J'ai réussi a obtenir le résultat souhaité avec une requête SQL classique, mais j'aimerais utiliser un objet Select.
Voici la requête SQL dont j'ai besoin :
SELECT c.image_id, c.user_name, c.comment, c.date FROM user u, image i, comment c WHERE c.image_id = i.image_id AND i.user_id = u.user_id AND u.user_id = 1 ORDER BY c.date DESC LIMIT 0 , 5
Voici le code PHP que j'ai écris :
$comms = new Comment(); $select = $comms->select() ->from(array('c' => 'comment'),array('image_id', 'user_name', 'comment', 'date')) ->join(array('i' => 'image'), 'c.image_id = i.image_id') ->join(array('u' => 'user'), 'i.user_id = u.user_id') ->where('u.user_id = ?', $user_id) ->order("c.date DESC") ->limit(5); $comList = $comms->fetchAll($select);
Apparemment, l'objet $select pose problème...
Est ce que quelqu'un peut m'aider ?
Merci d'avance
Dernière modification par Mr.MoOx (19-11-2009 09:59:32)
Hors ligne
Salut,
Essaie avec :
$comms->select()->setIntegrityCheck(false) //.... la suite de ton code
Par défaut, Zend_Db_Select permet de sélectionner des champs sur une table précise et non en dehors, et donc sur des tables jointes. Je ne sais pas pourquoi, mais suppose qu'ils ont pris cette décision pour s'assurer de respecter le pattern row data gateway et ainsi ne pas perdre toutes les fonctions disponibles sur les row, comme le save() par ex.
Passer "false" à la méthode setIntegrityCheck() permet de débrider ce fonctionnement, par contre attention il sera donc impossible de manipuler les rows obtenus en écriture (logique).
A+ benjamin.
Hors ligne
Merci, ca fonctionne très bien
Hors ligne
Delprog a écrit:
Salut,
Essaie avec :Code:
$comms->select()->setIntegrityCheck(false) //.... la suite de ton codePar défaut, Zend_Db_Select permet de sélectionner des champs sur une table précise et non en dehors, et donc sur des tables jointes. Je ne sais pas pourquoi, mais suppose qu'ils ont pris cette décision pour s'assurer de respecter le pattern row data gateway et ainsi ne pas perdre toutes les fonctions disponibles sur les row, comme le save() par ex.
Passer "false" à la méthode setIntegrityCheck() permet de débrider ce fonctionnement, par contre attention il sera donc impossible de manipuler les rows obtenus en écriture (logique).
A+ benjamin.
C'est Zend_Db_Table_Select qui a ce comportement, car comme son nom l'indique il est rattaché à une table et émet des exceptions si on sort de cette table. 2 solutions : $comms->getAdapter()->select() qui renvoie un Zend_Db_Select ou comme tu le dis $comms->select()->setIntegrityCheck(false)
@+
Hors ligne
Oui au temps pour moi, j'ai écris la classe un peu vite
Petite précision sinon pour colletjb, il me semble que par défaut Zend va t'inclure toutes les colonnes pour tes tables jointes, si ce n'est pas souhaité pense à passer "null" en 3ème paramètre de tes join().
A+ benjamin.
Hors ligne