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 :

Mapper deux tables sur une seule classe


Sujet :

Zend_Db PHP

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut Mapper deux tables sur une seule classe
    Salut,



    Je me demandais s'il était possible de mapper deux tables sur une seule classe...


    mon exemple :
    + 1 table membres avec id, pseudo, mail
    + 1 table rédacteurs avec membre_id, nom, prenom, site, etc

    je mappe ma classe membre sur la table membres, mais je ne vois pas comment mapper la classe rédacteur qui hérite de la classe membre

    nb : je n'ai pas fait la conception de la bdd, et je ne peux pas la modifier facilement
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    vraiment personne ?
    est-ce si difficile ? ou est-ce que personne ne l'a jamais fait car il s'agit surtout un problème de conception ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  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
    Je vois pas vraiment où est le problème

    Tu as deux tables dans la base de données, non ? Alors pourquoi tu ne fais pas deux classes (Membre et Redacteur) et tu ne mappes par ça avec 2 modèles (Membres et Redacteur par exemple) ?

    Tu pourrais expliquer un peu plus ton problème ?

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    Tu as deux tables dans la base de données, non ? Alors pourquoi tu ne fais pas deux classes (Membre et Redacteur) et tu ne mappes par ça avec 2 modèles (Membres et Redacteur par exemple) ?

    Tu pourrais expliquer un peu plus ton problème ?

    ben si je fais cela, je ne peux à partir d'un redacteur obtenir son email (qui est stocké dans membre), j'ai parfois besoin des infos qui sont dans membre et dans redacteur pour calculer quelque chose
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  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 gorgonite Voir le message
    ben si je fais cela, je ne peux à partir d'un redacteur obtenir son email (qui est stocké dans membre), j'ai parfois besoin des infos qui sont dans membre et dans redacteur pour calculer quelque chose
    Ah oki, j'ai compris

    Ouais, c'est pas pratique en effet... Je ne suis pas sûr que ce soit faisable tel quel

    Ce que tu peux faire, dans le modèle Redacteurs qui étend Zend_Db_Table_Abstract, c'est surcharger la méthode _fetch et là dedans rajouter toutes les infos que tu as besoin à ton enregistrement.

    [EDIT] Après, il faudra faire attention à aussi modifier la méthode save() de ton objet pour modifier les données partout.

  6. #6
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    tu crée une vue dans ta base
    qui fait ta jointure et tu mappe ta Zend_Db_Table dessus

    tu redéfini les méthodes d'insertion suppression et de mise à jour
    en faisant une transaction qui insère supprime ou modifie dans les deux table

    et c'est fait

  7. #7
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par sekaijin Voir le message
    tu crée une vue dans ta base
    qui fait ta jointure et tu mappe ta Zend_Db_Table dessus

    tu redéfini les méthodes d'insertion suppression et de mise à jour
    en faisant une transaction qui insère supprime ou modifie dans les deux table


    c'est à cela que je pensais à l'origine effectivement... mais s'il y a moyen de ne pas toucher à la bdd, je suis preneur


    je testerais la méthode de witchounet d'abord


    à vous deux
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  8. #8
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    oui mais il te faut redéfinir une multitudes de méthodes de Zend_Table
    en clair tu réécrit presque tout Zend_Table

    A+JYT

  9. #9
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    pour infos, il m'a suffit de faire ceci... mais j'aimerais bien des remarques

    mon fichier application/models/CandidatController.php

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    <?php
     
    class CandidatValue { } 
     
    class Candidat extends Zend_Db_Table
    {
        protected $_name            = 'candidats';
        protected $_primary         = array('user_id');
     
        public function fetch($id) {
            $db = $this->getAdapter();
            $sql = $db->quoteInto('SELECT * FROM view_candidats WHERE user_id = ?',$id); 
            return $db->query($sql)->fetchObject(__CLASS__);  
        }
     
        public function fetchAll($where = null, $order = null, $count = null, $offset = null) {
            $db = $this->getAdapter();
            $sql = 'SELECT * FROM view_candidats'
    		.(($where==null) ? '' : ' WHERE '.$where )
                    .(($order==null) ? '' : ' ORDER '.$order )
                    .(($count==null) ? '' : ' LIMIT '.(($offset==null) ? '' : $offset.',').$count);
    	$candidats = $db->query($sql)->fetchAll();
     
    	$res = array();
    	foreach ($candidats as $candidat) {
    		$tmp = new CandidatValue();
    		foreach ($candidat as $key=>$value) {
    			$tmp->$key = $value;
    		}
    		$res[] = $tmp;
    	}
     
    	return $res;
        }
     
        public function update(array $data, $where) {
            $fields_candidats = array("nom","prenom");
            $fields_users = array("login");
     
            $data_candidats = array();
            $data_users = array();
    	foreach ($data as $key=>$val) {
               if (in_array($key,$fields_candidats)) {
                  $data_candidats[$key] = $val;
               }
               if (in_array($key,$fields_users)) {
                  $data_users[$key] = $val;
               }
    	}
            $this->_db->update("users", $data_users, $where);
            $this->_db->update("candidats", $data_candidats, $where);
        }
     
        public function delete($where) {
            $db = $this->getAdapter();
            $sql = 'DELETE FROM candidats WHERE '.$where; 
            $db->query($sql);  
            $sql = 'DELETE FROM users WHERE '.$where; 
            $db->query($sql);  
        }
     
        public function insert(array $data) {
            $db = $this->getAdapter();
    	$db->query('CALL insert_candidats(:login,:nom,:prenom)',$data);
        }
    }

    et le code sql utilisé pour générer les tables, vues et procédures stockées...

    Code sql : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    drop table if exists `candidats` ;
    drop table if exists `users` ;
    --
    create table users (
       user_id bigint not null auto_increment,
       login varchar(255) not null unique,
       primary key (user_id) 
    ) type=innodb ;
    --
    create table candidats (
       user_id bigint not null,
       foreign key (user_id) references users(user_id),
       primary key (user_id),
       nom varchar(255) not null,
       prenom varchar(255) not null
    ) type=innodb ;
    --
    insert into users (login) values ('test') ;
    insert into candidats (user_id,nom,prenom) values ((select user_id from users where login='test'),'fou','testeur') ;
    --
    drop view if exists `view_candidats` ;
    create view view_candidats as
      select u.user_id,u.login,c.nom,c.prenom from users u, candidats c where c.user_id=u.user_id ;
    --
    select * from view_candidats ;
    --
    delimiter |
    drop procedure if exists `insert_candidats`|
    create procedure insert_candidats (
       in  _login   varchar(255),
       in  _nom     varchar(255),
       in  _prenom  varchar(255)
    )
    begin
       declare _id bigint(20) ;
       insert into users (login) values (_login) ;
       commit ;
       select last_insert_id() into _id ;
       insert into candidats (user_id,nom,prenom) values (_id,_nom,_prenom) ;
    end|
    delimiter ;
    --
    call insert_candidats('anonymous','Onyme','Anne') ;
    select * from view_candidats ;
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    vraiment aucune remarque ? ça n'intéresse personne, ou y a rien à redire ?


    perso, j'ai pas tapé de php depuis 2 ans, donc doit y a avoir des trucs pas très propres
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  11. #11
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Si, c'est intéressant. Et en plus c'est tout simple


  12. #12
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par Yogui Voir le message
    Si, c'est intéressant. Et en plus c'est tout simple


    j'ai essayé de faire simple en effet... mais a priori, je pense qu'il doit y avoir des failles par injections SQL là-dedans.
    en effet, j'ai eu du mal avec quoteInto, et je ne voulais pas utiliser les fonctions spécifiques de mysql
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  13. #13
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Je mettais à jour la FAQ ZF et j'allais ajouter ta proposition, mais je me suis rendu compte que je fais différemment... Du coup je te soumets ma méthode

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    class Candidat extends Zend_Db_Table
    {
        protected $_name            = 'candidats';
        protected $_primary         = array('user_id');
     
        public function fetch($id) {
            $select = $this->_db->select()
                ->from('view_candidats', '*')
                ->where('user_id = ?', $id);
     
            return $this->fetchRow($select);
        }
     
        public function fetchAll($where = null, $order = null, $count = null, $offset = null) {
            $select = $this->_db->select()
                ->from('view_candidats', '*');
     
            if($where) {
                $select->where($where);
            }
     
            if($order) {
                $select->order($order);
            }
     
            if($count) {
                $select->limit((int)$offset, $count);
            }
     
            $candidats = $this->fetchAll($select);
     
            $res = array();
            foreach ($candidats as $candidat) {
                $tmp = new CandidatValue();
                foreach ($candidat as $key=>$value) {
                    $tmp->$key = $value;
                }
                $res[] = $tmp;
            }
     
            return $res;
        }
    }
    etc.

  14. #14
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    j'ai fait ceci http://sekaijin.ovh.org/?p=21 qui permet de mapper autant de table jointe que l'on veut sur une seule classe

    A+JYT
    PS : j'ai fais ça à titre expérimental (car dans ma boite je suis encore avec ZF 1.0.3)

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

Discussions similaires

  1. deux tables vers une seule en Talend
    Par widom dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 10/07/2007, 14h37
  2. Deux tables et une seul liste
    Par cap38 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/05/2007, 14h51
  3. effacer un enregitrement de deux tables en une seule requete
    Par mikebranque dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/10/2006, 13h30
  4. (Performance) Deux tables ou une seule?
    Par Norin dans le forum Access
    Réponses: 26
    Dernier message: 24/06/2006, 20h43

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