Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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:
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:
$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:
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
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
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:
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é
Hors ligne
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:
$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
Hors ligne
si cela peu vous aider j'ai écrit ça il y a quelque temps
http://sekaijin.ovh.org/?p=21
Hors ligne
Ah mince alors même sur des clefs primaires ça passe pas
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
Hors ligne
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
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
Hors ligne
Pages: 1