IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Modèle et requête multi-table


Sujet :

Zend_Db PHP

  1. #1
    Membre habitué
    Profil pro
    Chef d’entreprise
    Inscrit en
    Mars 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mars 2002
    Messages : 212
    Points : 149
    Points
    149
    Par défaut Modèle et requête multi-table
    Bonjour,
    Mon problème est le suivant : Je voudrais avoir un modèle qui assure 2 fonctionnalité en se basant sur des Query ou des statement :

    1 - Récupération de données à partir d'une requête sur plusieurs tables.
    Voici un exemple. dans ce cas, j'ai détourné le problème du nombre de tables par la création d'une vue dans ma Bd. Par contre, j'ai encore un problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
    class mMoyProc extends Zend_Db_Table   {
     
    	protected $_name = vmoyen_processus;
    	protected $_primary = moyen_id;
     
    	public function listetesteur()
    	{
    		$db = $this->getDefaultAdapter();
    		$select = $db->select()
                 		->from('vmoyen_processus')
                 		->where('processus = ?','TEST');
     
    		$stmt = $db->query($select);
    		$result = $stmt->fetchAll();
    		return $result;
    		}
     
    }
     
    ?>
    Le problème avec ce code est que tout paraît fonctionner normalement : Aucun message d'erreur ni warning.
    Par contre, quand je fais appel à cette fonction dans mon contrôleur avec les deux lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	$moyens=new mMoyProc();
    	$this->view->testeurs= $moyens->listetesteur();
    Ensuite dans ma vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		<select name="testeur" style="border-color: #0000AF; padding: 0px;width: 100%">
    		<?php foreach ($this->testeurs as $moyens):?>
    		<option value="<?php echo trim($moyens->moyen_id); ?>"><?php echo trim($this->escape($moyens->libelle)); ?></option>
    		<?php endforeach; ?>
    		</select>
    La liste retournée à ma vue est vide!

    2- je voudrais faire des fonctions qui font appel à des procédures stockées dans ma bd pour faire des màj complexe.

    L'exécution des procédures stockées se fait par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ma_proc_stockee(param1, param2,...)
    merci de votre aide

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Le 'fetch mode' par défaut est le mode associatif (Zend_Db::FETCH_ASSOC). Il faut donc que dans ta vue tu accèdes à tes champs par indice plutôt que par référence de champ d'objet, comme tu le faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <option value="<?php echo trim($moyens['moyen_id']); ?>"><?php echo trim($this->escape($moyens['libelle'])); ?></option>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre habitué
    Profil pro
    Chef d’entreprise
    Inscrit en
    Mars 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mars 2002
    Messages : 212
    Points : 149
    Points
    149
    Par défaut
    Merci ça marche!!!
    Mais j'ai une question plus générique
    Si je veux pas faire appel à des vue dans ma BD et lancer la requête directement depuis mon modèle, comment faire?

    J'ai pensé entre autre à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class mMoyProc extends Zend_Db_Select   {}
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class mMoyProc extends Zend_Db_Table   {}
    Par contre je ne sais pas comment modifier ma classe et l'implémentation de ma fonction listetesteur() ?

    Merci

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Pour ta fonction listetesteur, le fait de dériver de Zend_Db_Table ne t'apporte rien. Tu utilises uniquement cet héritage pour récupérer l'adaptateur de BDD par défaut... Si tu n'utilises pas ta classe mMoyProc autrement, alors tu n'as pas besoin de dériver d'une classe du framework.

    Pour faire des requêtes qui utilisent plusieurs tables, tu peux utiliser un Zend_Db_Select et sa méthode join :
    http://framework.zend.com/manual/fr/....building.join

    Bon courage

  5. #5
    Membre habitué
    Profil pro
    Chef d’entreprise
    Inscrit en
    Mars 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mars 2002
    Messages : 212
    Points : 149
    Points
    149
    Par défaut
    Bonjour
    Merci pour cette précision.
    Vous avez mis le doigt sur une des difficultés que j'ai rencontré.
    Comment récupérer l'adaptateur de BDD par défaut dans mon modèle si j'utilise Zend_Db_Select ?

    Merci

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par ZIED Voir le message
    Merci pour cette précision.
    Vous avez mis le doigt sur une des difficultés que j'ai rencontré.
    Comment récupérer l'adaptateur de BDD par défaut dans mon modèle si j'utilise Zend_Db_Select ?
    Dans ton bootstrap, tu dois avoir un code qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Paramètre la bdd
    $db = Zend_Db::factory($adapter, $params);
    Zend_Db_Table::setDefaultAdapter($db);
    La méthode setDefaultAdapter() se contente de renseigner une propriété statique de la classe Zend_Db_Table. C'est cette propriété que tu lis ensuite en appelant la méthode getDefaultAdapter() (ces deux méthodes sont en fait des accesseurs qui permettent de modifier / consulter une propriété privée de la classe).

    Si tu as (vraiment) besoin d'accéder à cette propriété en dehors d'un objet Zend_Db_Table, tu peux toujours faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $adapter = Zend_Db_Table::getDefaultAdapter();
    Une autre façon de récupérer l'adaptateur, c'est de le stocker ailleurs, par exemple dans le registre de Zend, en ajoutant ce code dans le bootstrap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Zend_Registry::set('dbAdapter', $db);
    Pour le récupérer, il suffit alors d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $adapter = Zend_Registry::get('dbAdapter');
    Cette deuxième solution me parait plus propre que d'utiliser la propriété de Zend_Db_Table, ça évite à ton code de dépendre de cette classe uniquement pour récupérer l'adaptateur (bien sûr, si tu utilises d'autres fonctionnalités de Zend_Db_Table, c'est différent).

    J'espère que ça répond à ton problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête multi-tables :S
    Par plutonium719 dans le forum Développement
    Réponses: 4
    Dernier message: 12/03/2008, 16h41
  2. modifier des données dans une requête multi table
    Par Bluman dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/02/2008, 10h00
  3. PB requête multi-tables
    Par duchnok dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/01/2008, 12h25
  4. Requête multi-tables avec BDE
    Par Ptit_bouchon dans le forum Bases de données
    Réponses: 9
    Dernier message: 03/01/2008, 12h58
  5. problème de requête multi-table
    Par dergips dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/07/2007, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo