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 :

[1.0.2][Zend_db_table] Gérer les liaisons entre les tables


Sujet :

Zend_Db PHP

  1. #1
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    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 : 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
    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 :

    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

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 354
    Points : 15 700
    Points
    15 700
    Par défaut
    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

  3. #3
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    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 ?

  4. #4
    Membre habitué
    Inscrit en
    Juillet 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 190
    Points : 165
    Points
    165
    Par défaut
    Tu as essayé setFetchMode(Zend_Db::FETCH_OBJ); ?

  5. #5
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    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.

  6. #6
    Membre habitué
    Inscrit en
    Juillet 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 190
    Points : 165
    Points
    165
    Par défaut
    Et ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $link->role["name"];

  7. #7
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Ca m'affiche l'id du rôle

  8. #8
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    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

  9. #9
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

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

Discussions similaires

  1. Ignorer les liaisons entre les classeurs "sheets links"
    Par LANGAZOU dans le forum VBA Project
    Réponses: 0
    Dernier message: 16/06/2015, 14h30
  2. [XL-2007] Couper les liaisons entre les sources de données et leurs graphique en VBA
    Par mah.ngaz dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/04/2013, 19h05
  3. [Lazarus] SGBD, tables liées, SQLDB, comment créer les liaisons entre ces tables
    Par thierrybo dans le forum Lazarus
    Réponses: 3
    Dernier message: 23/03/2010, 07h55
  4. [Conception] Aide pour les liaison entre 2 table
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 02/09/2006, 13h03

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