Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour, j'ai deux table relié avec une "FK" "code_clt" j'ai besoin d'afficher les contacts (table cntct_clt) d'un client donné (table client) en comparant le code_clt, commen faire ça avec le zend ? j'arrive pas
le code sql je croi que c'est
select *
from client C, cntct_clt Cn
where C.code_clt = Cn.code_clt
j'ai une fonction liste :
"class Library_Model_ListeContact {
public function listeContact() {
$db = Zend_Db_Table::getDefaultAdapter();
$selectCntctFourns = new Zend_Db_Select( $db );
$selectCntctFourns->from( 'frn_contact','fournisseur')
->join('fournisseur', 'fournisseur.CODE_FRN = frn_contact.CODE_FRN')
->where('CODE_FRN = ?', 'CODE_FRN');
//->where('fournisseur.CODE_FRN = ?', 'CODE_FRN');
return $selectCntctFourns;
}
comment puis-je faire ce test pour que j'ai à l'affichage les contact d'un client donné ?
merci
Hors ligne
Bonjour,
Moi j'aurais écrit la requête SQL comme ça :
SELECT * FROM client AS C LEFT JOIN cntct_clt AS Cn ON Cn.code_clt = C.code_clt |
Ce qui donnerait avec Zend un truc du genre :
// Récupère le database adapter par défaut $db = Zend_Db_Table::getDefaultAdapter(); // Construit la requête et met les résultats directement dans un rowset $selectCntctFourns = $db ->fetchAll( $db ->select() ->from( array ( 'C' => 'client' )) ->joinLeft( array ( 'Cn' => 'cntclt_clt' ), 'C.code_client = Cn.code_client' , array ())); // Renvoie false si aucun résultat return (sizeof(selectCntctFourns) > 0 ? selectCntctFourns : false); |
A tester
Je ne suis pas sûr d'avoir écrit ça correctement, parce que je ne fais pas mes requêtes directement dans mes controllers ou dans mes plugins. J'utilise les models Zend_Db_Table_Abstract, et les dependentTables et findDependentRowset, ce qui présente bien des avantages, entre autres, d'avoir à écrire les liaisons entre les tables soi-même
Et désolé pour l'indentation du code, mais j'y arrive pas avec le bbcode
Dernière modification par delorbe (12-05-2012 22:05:59)
Hors ligne
salut, merci de me répondre
alors j'ai déjà essayer quelque chose comme ça ça m'affiche toujours tous les contacts de tous les client, j'ai écrit ton code et j'ai toujours le même résulta :'(
remarque : ce code est sous :
class Library_Model_ListeContact {
public function listeContact() {
après je fais appel à cette fonction dans le controleur.
Hors ligne
C'est normal
Cette requête t'affichera toutes les infos de la table client et de la table cntct_clt qui ont la clé code_client en commun.
C'est vrai que je n'avais pas vu ta question : tu veux afficher les infos d'un client donné.
Si tu veux limiter tes résultats à un client, il te faut ajouter une clause WHERE code_client = x
Où x est l'id du client pour lequel tu veux afficher les résultats.
En SQL, ça donne :
SELECT * FROM client AS C LEFT JOIN cntct_clt AS Cn ON Cn.code_clt = C.code_clt WHERE C.code_client = x |
Et dans ta fonction :
public function listeContact( $codeClient = null){ // Si on a appelé la fonction avec un code client, alors on fait le traitement if ( $codeClient ){ // Récupère le database adapter par défaut $db = Zend_Db_Table::getDefaultAdapter(); // Construit la requête et met les résultats directement dans un rowset $selectCntctFourns = $db ->fetchAll( $db ->select() ->from( array ( 'C' => 'client' )) ->joinLeft( array ( 'Cn' => 'cntclt_clt' ), 'C.code_client = Cn.code_client' , array ()) ->where( 'C.code_client = ?' , $codeClient )); // Renvoie false si aucun résultat return (sizeof(selectCntctFourns) > 0 ? selectCntctFourns : false); } } |
Puis tu appelles ta fonction :
listeContact(x); |
Où x est toujours ton code client.
Dernière modification par delorbe (12-05-2012 22:07:24)
Hors ligne
ça marche toujours pas :'(
class Library_Model_ListeContact {
public function listeContact($CODE_FRN = null) {
if($CODE_FRN){
$db = Zend_Db_Table::getDefaultAdapter();
$selectCntcFRN= $db->fetchAll($db->select()
->from(array('F' => 'fournisseur'))
->joinLeft(array('Fn' => 'frn_contact'),
'F.fournisseur = Fn.frn_contact',
array())
->where('F.fournisseur= ?', $CODE_FRN));
return(sizeof($selectCntctFRN) > 0 ? $selectCntctFRN : false);
}
}
ça fait 2 jour que j'arrive pas à fixer ça :'( il m'affiche toujours tous les contacts de tous les fourniseurs
Hors ligne
Heu...
Tu parles au départ de :
1. Une table client avec en clé primaire code_client
2. Une table cntct_clt avec en clé étrangère code_client
Si je lis bien ton code, tu fais tes tests avec :
1. Une table fournisseur avec en clé primaire fournisseur
2. Une table frn_contact avec en clé étrangère frn_contact
Tu es sûr que tu ne t'es pas embrouillé dans tes tests?
Hors ligne
salut, non non c'est juste que j'ai deux module client et fournisseur avec les mêmes actions, j'ai posé ma question en utilisant client et j'écrit le code pour le fournisseur :p
Mon problème que quand je clique afficher contacts d'un fournisseur donnée on m'affiche touts les contact de tous les fournisseur hors que j'ai besoin d'afficher que les contacts d'un fournisseur tel !
Merci pour votre aide, j'en ai tellement besoin
Hors ligne
Il n'empêche que dans le code que tu donnes, la table s'appelle exactement pareil que la clé...
->from( array ( 'F' => 'fournisseur' )) ->joinLeft( array ( 'Fn' => 'frn_contact' ), 'F.fournisseur = Fn.frn_contact' , array ()) |
Ici , je comprends que dans ta table fournisseur, la clé s'appelle fournisseur.
Et que dans ta table frn_contact, la clé s'appelle frn_contact
Je ne sais pas si ça peut poser un souci au niveau SQL, mais il est en général recommandé de nommer les champs (surtout la clé primaire) autrement que la table elle-même.
Cela dit, si ça passe comme ça, alors bon...
De plus, j'ai fait une petite erreur dans mon code.
Tu veux récupérer un seul enregistrement, il ne faut donc pas utiliser $db->fetchAll() mais $db->fetchRow();
Hors ligne
j'arrive pas :'''''(((( help pleeeez :'( pourquoi j'ai tjrs toutes la liste qui s'affiche :'(
Hors ligne
Bon, ben problème résolu par mail
Le problème principal était - à mon avis - que le code fournisseur passé en GET lors de l'appel de la page, n'était tout simplement pas récupéré, et donc pas utilisé en clause WHERE de la requête
Hors ligne
Merci infiniment pour l'aide problème résolu
Hors ligne
De rien
Bon courage pour la suite de ton projet
Hors ligne