Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Db
Zend_Db Forum d'entraide pour le composant Zend_Db du Zend Framework (création de requêtes, abstraction, ORM etc.). Avant de poster -> FAQ Zend_Db.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/06/2008, 13h09   #1
Membre régulier
 
Inscription : mars 2002
Messages : 204
Détails du profil
Informations personnelles :
Localisation : Tunisie

Informations forums :
Inscription : mars 2002
Messages : 204
Points : 77
Points : 77
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 :
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 :
1
2
	$moyens=new mMoyProc();
	$this->view->testeurs= $moyens->listetesteur();
Ensuite dans ma vue
Code :
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 :
select ma_proc_stockee(param1, param2,...)
merci de votre aide
ZIED est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2008, 10h27   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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 :
<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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2008, 11h17   #3
Membre régulier
 
Inscription : mars 2002
Messages : 204
Détails du profil
Informations personnelles :
Localisation : Tunisie

Informations forums :
Inscription : mars 2002
Messages : 204
Points : 77
Points : 77
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 :
class mMoyProc extends Zend_Db_Select   {}
au lieu de
Code :
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
ZIED est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2008, 13h36   #4
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
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
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2008, 14h20   #5
Membre régulier
 
Inscription : mars 2002
Messages : 204
Détails du profil
Informations personnelles :
Localisation : Tunisie

Informations forums :
Inscription : mars 2002
Messages : 204
Points : 77
Points : 77
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
ZIED est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2008, 15h13   #6
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
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 :
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 :
$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 :
Zend_Registry::set('dbAdapter', $db);
Pour le récupérer, il suffit alors d'utiliser :
Code :
$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
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h12.


 
 
 
 
Partenaires

Hébergement Web