Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 26-02-2008 10:42:42

Aquanum
Membre
Date d'inscription: 20-02-2008
Messages: 13

Jointure simple & Zend_Db_Table_Abstract

Bonjour, je cherche à réaliser une jointure simple entre 2 tables avec Zend, et je m'arrache les cheveux depuis 2 jours dessus.

j'ai une table CHEQUE(CHQ_ID,CHQ_NUMERO, CHQ_NOM_PAYEUR, CHQ_PRENOM_PAYEUR...)
et une table COLLABORATEUR(COL_ID, COL_NOM, COL_PRENOM)

et je souhaiterais faire une requête de ce type:

Code:

SELECT cheque.CHQ_ID, cheque.CHQ_NUMERO
FROM `cheque`, `collaborateur`
WHERE (cheque.CHQ_PRENOM_PAYEUR = collaborateur.COL_PRENOM AND cheque.CHQ_NOM_PAYEUR = collaborateur.COL_NOM) AND ( collaborateur.COL_ID = 33 )

Alors, les docs de Zend ne m'aident pas beaucoup là dessus. J'ai trouvé un truc du style:

Code:

$table = new Bugs();

$select = $table->select();
$select->where('bug_status = ?', 'NEW')
       ->join('accounts', 'accounts.account_id = bugs.reported_by')
       ->where('accounts.account_name = ?', 'Bob');

$rows = $table->fetchAll($select);

Mais je n'arrive pas à l'appliquer à mon cas, en effet j'ai essayé des trucs du genre:

Code:

Zend_Loader::loadClass('Cheque');
$cheque = new Cheque;
$select = $cheque->select()->setIntegrityCheck(false);

$select -> // un where? mais ça ne marche pas
        -> // un join de la table cheque? car il semblerait que sans cela cheque n'est pas chargée... ? mais ça ne marche pas
        ->join('collaborateur','collaborateur.COL_NOM=cheque.CHQ_NOM_PAYEUR AND collaborateur.COL_PRENOM=CHQ_PRENOM_PAYEUR')
        ->where('collaborateur.COL_ID = '.$colId);

Et je dois absolument partir de classes de type Zend_Db_Table_Abstract.

Enfin voilà, j'ai découvert Zend il y a 3 semaines et parfois je reste bloqué sur des trucs vraiment tout simple à faire en temps normal (à la main, sans Zend)...

Donc j'aurais aimé savoir si quelqu'un pouvait me renseigner sur la bonne façon d'utiliser cette syntaxe pour réaliser ma requête.

En vous remerciant d'avance, bonne journée.

Hors ligne

 

#2 26-02-2008 13:51:34

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Jointure simple & Zend_Db_Table_Abstract

J'ai eu le problème ce matin et il n'est malheureusement pas possible de faire des jointures à patir de Zend_Db_Table.
le $select()->setIntegrityCheck(false) peux faire marché la chose mais pour moi ça m'a pondu un requête bizarre et apparement ça marche pas non plus pour toi.

Hors ligne

 

#3 26-02-2008 14:07:16

Aquanum
Membre
Date d'inscription: 20-02-2008
Messages: 13

Re: Jointure simple & Zend_Db_Table_Abstract

Arg, pas top du tout... merci pour ta réponse.
Je viens de voir cette phrase dans la doc de Zend.

You can query for a set of rows using any criteria other than the primary key values, using the fetchAll() method of the Table class. This method returns an object of type Zend_Db_Table_Rowset_Abstract.

Il y a des chance que les jointures sur des champs qui ne sont pas clé ne marchent pas. Il faudrait que j'essaye sur des jointures sur clé.

Par chance, dans mon cas, je viens de trouver une solution évitant mon problème. En fait je peux directement travailler grace aux clefs sans passer par les champs nom et prénom. Ce qui me donne ça:

Code:

Zend_Loader::loadClass('Cheque');
$cheque = new Cheque;

Zend_Loader::loadClass('Zend_Filter_StripTags');
$filter = new Zend_Filter_StripTags();

$colId = trim($filter->filter($this->_request->getPost('collaborateurId')));
$select = $cheque->select();        
$select ->where('CHQ_COLL = ?',$colId);
$result = $cheque->fetchAll($select);

Maintenant je suis sûr que j'aurai tôt ou tard besoin de faire une jointure, donc je vais essayer de chercher comment faire. Maintenant c'est étonnant que Zend ne permette pas cela, en plus la jointure de 2 table c'est pas bien compliqué tongue

Hors ligne

 

#4 26-02-2008 14:18:33

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Jointure simple & Zend_Db_Table_Abstract

Il y a des chance que les jointures sur des champs qui ne sont pas clé ne marchent pas. Il faudrait que j'essaye sur des jointures sur clé.

Mes champs 2 critères de jointures étaient des clés primaires... :s

Mes jointures du coup je les ai fait ainsi:

Code:

$select = $db->select()
    ->from(array('a'=>DB_TABLE_ADS, 'b'=>DB_TABLE_BOOKMARKS))
    ->where(...)
    ->joinLeft(array('b'=>DB_TABLE_BOOKMARKS),'b.id_user = '.(int)$this->user->id_user.' AND b.id_ad = a.id_ad');

PS: quand tu sais ce que tu charges, utilise plutôt require que Zend_Loader::loadClass(). C'est bien moins lourd! Il y'a plusieurs discussions a ce sujet sur le forum wink

Hors ligne

 

#5 26-02-2008 14:22:42

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Jointure simple & Zend_Db_Table_Abstract

si cela peu vous aider j'ai écrit ça il y a quelque temps
http://sekaijin.ovh.org/?p=21

Hors ligne

 

#6 26-02-2008 14:27:09

Aquanum
Membre
Date d'inscription: 20-02-2008
Messages: 13

Re: Jointure simple & Zend_Db_Table_Abstract

Ah mince alors même sur des clefs primaires ça passe pas hmm
Comment faire alors... dur
Sinon merci pour les conseils, je vais regarder pour les require. A vrai dire, je suis en stage et je reprends le boulot d'un précédent stagiaire. Du coup j'utilise son code pour l'instant sans savoir ce qui est bien ou pas, je n'ai pas encore assez de recul sur Zend. Mais je vais regarder si je peux changer ça wink

Hors ligne

 

#7 07-03-2008 11:47:19

Aquanum
Membre
Date d'inscription: 20-02-2008
Messages: 13

Re: Jointure simple & Zend_Db_Table_Abstract

Alors avec-vous trouvé une technique pour faire une jointure proprement en utilisant des Zend_Db_Table_Abstract?

Dernière modification par Aquanum (07-03-2008 11:47:57)

Hors ligne

 

#8 07-03-2008 15:34:40

Aquanum
Membre
Date d'inscription: 20-02-2008
Messages: 13

Re: Jointure simple & Zend_Db_Table_Abstract

cf la doc de Zend

You can not specify columns from a JOINed tabled to be returned in a row/rowset. Doing so will throw an exception. This was done to ensure the integrity of the Zend_Db_Table is retained. i.e. A Zend_Db_Table_Row should only reference columns derived from its parent table.

Ca semble donc tout bonnement impossible de partir d'une table mise dans une classe.
je suis passé par $select = $db->select()... comme toi et effectivement là ça marche hmm

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