Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
En tant que nouvel utilisateur du Zend Framework j'aimerais convertir mes requêtes MySQL mais après de longues recherches je n'arrive pas sur une certaine requête.
Voici mon problème :
J'ai 2 bases de données (et non deux tables) différentes situées sur le même serveur :
lesson et multicompte.
Je voudrais récupérer la liste des professeurs (située sur lesson.professeurs, professeurs étant une table)
liée à un utilisateur (Toto étant l'identifiant du client, voir ci-dessous).
Avant de passer à zend j'utilisais cette simple requête :
[lang=sql]SELECT p.* FROM lesson.professeurs p INNER JOIN multicompte.comptes c ON p.seq = c.lesson WHERE c.ident = 'Toto'
Où multicompte.comptes.lesson (c.lesson) correspond à un INT associé à lesson.professeurs.seq (p.seq) pour identifier à quel cours l'utilisateur a accès.
Le soucis c'est que je n'arrive pas à retranscrire ma requête avec la séparation de la BDD comme je l'avais vu sous zend avec le query. Je pensais donc utiliser des select différents mais je n'arrive quand même pas à récupérer ce que je désire avec cette idée :
Voici la première version (sans jointures) que j'avais écrite qui ne marche pas :
[lang=php] $select = $_db_lesson $select->from( array( 'lesson.professeurs p', 'multicompte.comptes c', 'multicompte.custom a' ), array( 'p.*' ) ); $select->where( 'c.ident= ?', $username); $select->andWhere( 'a.ident=c.ident' ); $select->andWhere( 'c.lesson=p.seq' ); $resultRowSet = $select->fetchAll();
Et voici l'idée que j'avais eu pour me sortir de ce soucis mais je n'arrive pas à aller plus loin.
[lang=php] protected $_db_multicompte; protected $_db_lesson; // Les db sont associées dans le constructeur de ma classe, il n'y a pas de soucis sur ça. $select_multicompte = $this->_db_multicompte->select(); $select_lesson = $this->_db_lesson->select();
Je n'arrive pas à reconstruire ma requête selon ce principe.
J'avais pensé utiliser les vues SQL mais je n'ai pas trouvé comment les transcrire sur zend.
Je vous remercie d'avance pour votre aide et si je n'ai pas été assez clair n'hésitez pas à me le signaler !
Dernière modification par blackwires (10-08-2012 15:13:17)
Hors ligne
bonjour,
il me semble que votre requête en elle même pose problème même si elle ne concernerait qu'une seule BD.En effet, from ne peut que prendre ces arguments: 'une seule table' puis 'des colonnes'. Dans votre cas vous attribuez à from 2 tables.
Si vous voulez effectuez une jointure il vous faut la méthode join (équivalent jointure naturelle en SQL)
blackwires a écrit:
Bonjour à tous,
Voici mon problème :
Voici la première version (sans jointures) que j'avais écrite qui ne marche pas :Code:
[lang=php] $select = $_db_lesson $select->from( array( 'lesson.professeurs p', 'multicompte.comptes c', 'multicompte.custom a' ), array( 'p.*' ) ); $select->where( 'c.ident= ?', $username); $select->andWhere( 'a.ident=c.ident' ); $select->andWhere( 'c.lesson=p.seq' ); $resultRowSet = $select->fetchAll();!
Hors ligne
Je vous remercie pour cette information, je suis entrain de la réécrire avec la méthode inner join mais demeure mon plus gros soucis, réaliser une jointure sur une table située dans une autre DB ? Peut-on indiquer une DB à la jointure car je n'ai pas trouvé cette fonctionnalité ou alors procéder d'une autre manière ?
Voici le nouveau code :
[lang=php] $select->from( array('p' => 'lesson.professeurs p'), array( 'p.*' ) ); $select->joinInner( array('c' => 'multicompte.comptes c'), 'p.seq = c.lesson' ); $select->where( 'c.ident = ?', $username); $resultRowSet = $select->fetchAll();
Cordialement
Dernière modification par blackwires (10-08-2012 16:24:08)
Hors ligne
Dans le dernier argument de join vous pouvez préciser le nom de votre BD
Voici un exemple requête:
[lang=php] $query=$this->select()->from(array('p'=>'professeurs'),array('*'))->setIntegrityCheck(false) ->join(array('c'=>'comptes'),//table comptes 'p.id=c.prof_id', //condition de jointures entre prof et comptes array('col1','col2'), //colonnes à selectionner 'multicomptes' //nom de la BD ) ->join( .......); $this->fetchAll($query);
Dernière modification par amiss (10-08-2012 16:20:53)
Hors ligne
pour voir la requête SQL générée faites un echo de l'objet $query.
Hors ligne
Je vous remercie pour votre aide je n'avais pas trouvé qu'il fallait rajouter un paramètre pour spécifier la DB.
Par contre peut-on faire en sorte de toutes les sélectionner sans avoir à les spécifier ?
Merci d'avance.
Hors ligne
bien sûr que oui on peut sélectionner toutes les colonnes sans les spécifier dans la requête. Dans ce cas soient vous les omettez soient à place de ces colonnes mettez '*' dans from et/ou dans join
->from('table','*') ...//idem dans join
Hors ligne
Effectivement tout simple.
Je vous remercie pour votre aide qui m'a grandement débloquée et pour votre attention !
Hors ligne
de rien
Hors ligne
Pages: 1