Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 18-11-2009 20:46:50

colletjb
Nouveau membre
Date d'inscription: 18-11-2009
Messages: 2

[Résolu] Triple Jointure

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 :

Code:

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 :

Code:

$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

 

#2 18-11-2009 22:27:29

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu] Triple Jointure

Salut,

Essaie avec :

Code:

$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.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#3 19-11-2009 09:31:05

colletjb
Nouveau membre
Date d'inscription: 18-11-2009
Messages: 2

Re: [Résolu] Triple Jointure

Merci, ca fonctionne très bien wink

Hors ligne

 

#4 19-11-2009 09:42:34

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Triple Jointure

Delprog a écrit:

Salut,

Essaie avec :

Code:

$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.

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)

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#5 19-11-2009 13:34:18

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu] Triple Jointure

Oui au temps pour moi, j'ai écris la classe un peu vite smile

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.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

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