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 04/10/2007, 10h24   #1
Expert Confirmé Sénior
 
Avatar de Baptiste Wicht
 
Homme Baptiste Wicht
Étudiant
Inscription : octobre 2005
Messages : 7 465
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Wicht
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2005
Messages : 7 465
Points : 16 862
Points : 16 862
Envoyer un message via MSN à Baptiste Wicht
Par défaut [1.0.2][Zend_db_table] Gérer les liaisons entre les tables

Bonjour,

Je suis en train de me faire au fonctionnement du Zend Framework et j'arrive pas à me dépatouiller avec les liaisons entre les tables.

J'ai une classe DemandeursLinks :

Code PHP :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
	class DemandeursLinks extends Zend_Db_Table{
	    protected $_name = 't_demandeurs_links';
 
		protected $_referenceMap = array(
			'demande' => array( 
				'columns' => array('demande'),
				'refTableClass' => 'Demandes', 
				'refColumns' => 'id',
			),
			'demandeur' => array(
				'columns' => array('demandeur'),
				'refTableClass' => 'Demandeurs',
				'refColumns' => 'id',
			),
			'role' => array(
				'columns' => array('role'),
				'refTableClass' => 'Roles',
				'refColumns' => 'id',
			)
		);
	}
?>

les colonnes role, demandeur, demande de cette table contiennent les id pour les lier à d'autres tables gérées par les classes Roles, Demandeurs et Demandes. J'aimerais donc qu'au lieu de me renvoyer ces id, il me renvoie directement les objets en question qu'il va chercher dans l'autre classe, mais ce que j'ai fait dans la classe ne marche pas...

Quand j'essaie de faire :

Il me dit :

Citation:
Trying to get property of non-object in ...
Je ne sais pas vraiment comment récupérer ça...

Est-ce qu'au moins ce que je veux faire est possible ? Et si oui comment ?

Merci beaucoup
Baptiste Wicht est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 10h34   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
c'est possible mais ce que je vais te proposer n'a rien à voir avec Zend

tu as la méthode magique "__get" qui permet de gérer le cas où l'attribut n'existe pas
regarde là :
http://php.net/oop5.overloading
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 10h46   #3
Expert Confirmé Sénior
 
Avatar de Baptiste Wicht
 
Homme Baptiste Wicht
Étudiant
Inscription : octobre 2005
Messages : 7 465
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Wicht
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2005
Messages : 7 465
Points : 16 862
Points : 16 862
Envoyer un message via MSN à Baptiste Wicht
Donc, il faudrait que je surcharge la méthode get pour pouvoir récupérer mes membres de façon différente.

Le problème c'est que je n'ai pas d'objet DemandeurLink, je reprend directement l'objet que Zend me renvoie. En plus, il me semble quand même que c'est un peu comme utiliser un marteau pour tuer une mouche... Il n'y a rien de plus simple pour faire cela avec Zend ?
Baptiste Wicht est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 11h34   #4
Membre régulier
 
Inscription : juillet 2002
Messages : 149
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 149
Points : 80
Points : 80
Tu as essayé setFetchMode(Zend_Db::FETCH_OBJ); ?
SQUAL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 12h04   #5
Expert Confirmé Sénior
 
Avatar de Baptiste Wicht
 
Homme Baptiste Wicht
Étudiant
Inscription : octobre 2005
Messages : 7 465
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Wicht
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2005
Messages : 7 465
Points : 16 862
Points : 16 862
Envoyer un message via MSN à Baptiste Wicht
Citation:
Envoyé par SQUAL Voir le message
Tu as essayé setFetchMode(Zend_Db::FETCH_OBJ); ?
Je viens d'essayer sur mon objet Zend_Db et ça ne change rien.
Baptiste Wicht est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 12h43   #6
Membre régulier
 
Inscription : juillet 2002
Messages : 149
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 149
Points : 80
Points : 80
Et ca ?
Code :
1
2
 
$link->role["name"];
SQUAL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 13h29   #7
Expert Confirmé Sénior
 
Avatar de Baptiste Wicht
 
Homme Baptiste Wicht
Étudiant
Inscription : octobre 2005
Messages : 7 465
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Wicht
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2005
Messages : 7 465
Points : 16 862
Points : 16 862
Envoyer un message via MSN à Baptiste Wicht
Ca m'affiche l'id du rôle
Baptiste Wicht est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 13h30   #8
Expert Confirmé Sénior
 
Avatar de Baptiste Wicht
 
Homme Baptiste Wicht
Étudiant
Inscription : octobre 2005
Messages : 7 465
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Wicht
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2005
Messages : 7 465
Points : 16 862
Points : 16 862
Envoyer un message via MSN à Baptiste Wicht
Bon, ce que je pourrais faire au pire, c'est surcharger la méthode fetchAll(), parcourir les résultats renvoyés par la méthode parente et rechercher dans les autres classes les résultats, mais je trouve que c'est moche et assez lourd
Baptiste Wicht est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2007, 09h00   #9
Expert Confirmé Sénior
 
Avatar de Baptiste Wicht
 
Homme Baptiste Wicht
Étudiant
Inscription : octobre 2005
Messages : 7 465
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Wicht
Âge : 24
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2005
Messages : 7 465
Points : 16 862
Points : 16 862
Envoyer un message via MSN à Baptiste Wicht
J'ai résolu mon problème

En fait, Zend Framework ne gère que le Lazy Loading, il aurait donc fallu que je fasse encore des recherches parent enfant pour récupérer ce que je voulais.

La solution était donc de passer en Full Loading, je me suis un peu inspiré du code de Julien Pauli pour faire mon propre full Loading.

Pour ceux que ça intèresse, voilà comment je gère ça :

J'ai créée une nouvelle classe étendant Zend_Db_Table dans laquelle j'ai surchargée la méthode _fetch :

Code PHP :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
	abstract class CooperTable extends Zend_Db_Table {
		protected function _fetch($where = null, $order = null, $count = null, $offset = null){ 
			$rows = parent::_fetch($where, $order, $count, $offset); 
 
			if(isset($this->_relations) && !empty($this->_relations)){
				if (is_array($rows) && !empty($rows)){ 
					$models = array ();
 
					foreach ($this->_relations as $columnName => $modelClass){
						Zend_Loader::loadClass($modelClass); 		//Chargement du modèle
						$models[$columnName] = new $modelClass(); 	//Instanciation du modèle
					}
 
					foreach($rows as &$row){ 
						foreach ($models as $column => $model){ 
							if(array_key_exists($column, $row)){
								$row[$column] = $model->find($row[$column])->current(); 
							} 
						}
					} 
				}
			}
 
			return $rows; 
		}
	}
?>

Ensuite, il suffit que j'étende cette classe et que je déclare un tableau $_relations qui définit les liens entre les colonnes et les classes de modèles qu'il faut appeller :

Code PHP :
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
	require_once "CooperTable.php";
 
	class DemandeursLinks extends CooperTable {
		protected $_name = 't_demandeurs_links';
 
		protected $_relations =  array (
	 		"demande" => "Demandes",
	 		"demandeur" => "Demandeurs",
	 		"role" => "Roles",
		);
	}
?>

Eh voilà

à tous ceux qui m'ont aidé dans ce post.
Baptiste Wicht 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 21h51.


 
 
 
 
Partenaires

Hébergement Web