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 :

Héritage entre modèles ? [ZF 1.9]


Sujet :

Zend_Db PHP

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 70
    Par défaut Héritage entre modèles ?
    Bonjour,

    J'ai une table dans ma base de données qui contient un certain nombre de champs et une deuxième table qui possède une clé étrangère sur la première.
    Ceci permet d'ajouter d'autres champs à la première.

    Ex : personnes(idPersonne, nom, prenom)
    employes(idEmploye, idPersonne, salaire)

    Je voulais savoir s'il était possible de faire un genre d'héritage, afin de manipuler qu'un seul modèle ?

  2. #2
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Bonjour,

    Bien sûr que c'est possible. Vu la structure, je me demande même pourquoi on ne le ferait pas ?

    --- edit ---

    J'avais aps vu le mot "héritage"...
    J'utiliserais plutôt une composition d'objets si tu veux utiliser Zend_Db

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 70
    Par défaut
    Je vois pas trop comment faire la composition si je crée 2 classes qui étendent chacune Zend_Db_Table_Abstract.

    Ou alors ce n'est pas ça et la composition se fait sur un row.

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 70
    Par défaut
    J'ai ma classe qui représente ma table " personnes "

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Model_DbTable_Personnes extends Zend_Db_Table_Abstract {
     
    	protected $_name = 'personnes';	
    	protected $_primary = 'idPersonne';
     
    }
    J'ai ma classe qui représente ma table " employes"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Model_DbTable_Employes extends Zend_Db_Table_Abstract {
     
    	protected $_name = 'employes';	
    	protected $_primary = 'idEmploye';
     
    }
    Comment faire quelque chose dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $employes = new employes();
    $datas = array('nom' => 'Dupond', 'prenom' => 'Martin', 'salaire' => '1000');
    $employes->insert($datas);

  5. #5
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Une façon de faire : implémenter la méthode dans la classe employees

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function insert() {
       // appel de la classe mère pour insérer la personne.
       parent::insert();
       // si ça se passe bien, insertion des infos supplémentaires
       $table = Model_DbTable_Employes();
       $row   = $table->createRow();
       // alimentation du row;
       $row   ->save();
    }
    PS : codé à l'arrache et de mémoire, peut-être pas tout à fait exact. C'est juste pour le principe.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Par défaut
    Salut,

    Pour résoudre les problèmes d'héritages de Zend_De_Table, j'utilise les vues SQL.

    Pour reprendre ton exemple je créé 2 vues et 2 procédures stockés dans la BDD:

    Vue personne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create view orm_personne
    as
    select idPersonne as id,
             nom,
             prenom
    from personnes
    Vue employé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create view orm_employe
    as
    select e.idEmploye as id,
             p.nom,
             p.prenom,
             e.salaire
    from personnes p
           join employes e on p.idPersonne = e.idPersonne
    Les procédures (à adapter au SGBD que tu utilises):

    Ajouter une personne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create procedure insert_personne(_nom varchar, _prenom varchar)
    begin
           insert into personnes(nom, prenom) values (_nom, _prenom);
           select "la_fonction_sql_qui_donne_le_dernier_id_inseré"
    end
    Ajouter un employé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    create procedure insert_salarie(_nom varchar, _prenom varchar, _salaire real)
    BEGIN
          DECLARE
                _idPersonne int;
     
          select insert_personne(_nom, _prenom) into _idPersonne;
     
          insert into employes (idPersone, salaire)
          values(_idPersonne, _salaire);
     
          select "la_fonction_sql_qui_donne_le_dernier_id_inseré";
    END
    Au niveau de Zend je créé 4 classes 2 Zend_Db_Table pour chaque vues, et 2 Zend_Db_Table_Row, qui me permet de manipuler les objects Personne et Employé

    Classe Model_DbTable_Personnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Model_DbTable_Personnes extends Zend_Db_Table_Abstract {
     
    	protected $_name = 'orm_personne';	
    	protected $_primary = 'id';
            protected $_rowClass = "Model_Object_Personne";
    }
    class Model_DbTable_Employes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Model_DbTable_Employes extends Model_DbTable_Personnes {	
    	protected $_name = 'orm_employe';	
    	protected $_primary = 'id';
            protected $_rowClass = "Model_Object_Employe";
    }
    class Model_Object_Personne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Model_Object_Personne extends Zend_Db_Table_Row_Abstract{
     
      // Attributs id, nom, prenom de la vue orm_personne
     
      // Les méthode propres à un personne
     
       public function save(){
         //appel de la procedure SQL insert_personne
       }
     
    }
    class Model_Object_Employe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Model_Object_Employe extends Model_Object_Personne{
    
       //attribut id, nom, prenom, salaire de la vue orm_employe
    
       // Méthode propre à un employé + héritage des méthode de la classe 
       // Model_Object_Personne
    
       public function save(){
         //appel de la procedure SQL insert_employe
       }
    }
    Je peux donc faire maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $employe = new Model_Object_Employe();
    $employe->nom = "Dupond";
    $employe->prenom = "Martin";
    $employe->salaire = 1000;
    $employe->save();
    Voila, c'est un peu lourd à mettre en place, mais l'intérêt est bien la, tu manipules des objets auxquelles tu peux ajouter des méthodes et non plus le Zend_Db_Table_Row. Puis au niveau des procédures dans le SGBD tu peux ajouter tout un tas de contrôle avant insertion.

    Tu peux lire l'article de Julien Pauli qui explique plus en détail ce modèle

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 70
    Par défaut
    Intéressant comme démarche.
    Je vais étudier ça de plus près.
    Merci.

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

Discussions similaires

  1. [POO] Héritage entre deux classes
    Par Lenaick dans le forum Langage
    Réponses: 5
    Dernier message: 16/10/2007, 09h53
  2. relation d'héritage entre acteurs
    Par pigeon11 dans le forum Cas d'utilisation
    Réponses: 8
    Dernier message: 31/08/2007, 18h34
  3. Master Page héritage entre elles
    Par zooffy dans le forum ASP.NET
    Réponses: 7
    Dernier message: 04/03/2007, 19h30
  4. [EJB] Héritage entre EJB
    Par zsoh dans le forum Java EE
    Réponses: 3
    Dernier message: 20/02/2006, 08h57
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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