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 14/10/2007, 20h49   #1
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur Système
Inscription : décembre 2005
Messages : 9 774
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Ingénieur Système
Secteur : Transports

Informations forums :
Inscription : décembre 2005
Messages : 9 774
Points : 14 303
Points : 14 303
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
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 10h29   #2
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur Système
Inscription : décembre 2005
Messages : 9 774
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Ingénieur Système
Secteur : Transports

Informations forums :
Inscription : décembre 2005
Messages : 9 774
Points : 14 303
Points : 14 303
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
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 10h37   #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
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 ?
Baptiste Wicht est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 10h51   #4
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur Système
Inscription : décembre 2005
Messages : 9 774
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Ingénieur Système
Secteur : Transports

Informations forums :
Inscription : décembre 2005
Messages : 9 774
Points : 14 303
Points : 14 303
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
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 11h05   #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 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.
Baptiste Wicht est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 13h33   #6
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 428
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 428
Points : 2 815
Points : 2 815
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
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 13h46   #7
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur Système
Inscription : décembre 2005
Messages : 9 774
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Ingénieur Système
Secteur : Transports

Informations forums :
Inscription : décembre 2005
Messages : 9 774
Points : 14 303
Points : 14 303
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
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2007, 17h14   #8
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 428
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 428
Points : 2 815
Points : 2 815
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
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2007, 21h22   #9
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur Système
Inscription : décembre 2005
Messages : 9 774
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Ingénieur Système
Secteur : Transports

Informations forums :
Inscription : décembre 2005
Messages : 9 774
Points : 14 303
Points : 14 303
pour infos, il m'a suffit de faire ceci... mais j'aimerais bien des remarques

mon fichier application/models/CandidatController.php

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
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 :
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
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2007, 17h08   #10
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur Système
Inscription : décembre 2005
Messages : 9 774
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Ingénieur Système
Secteur : Transports

Informations forums :
Inscription : décembre 2005
Messages : 9 774
Points : 14 303
Points : 14 303
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
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2007, 17h12   #11
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Si, c'est intéressant. Et en plus c'est tout simple

__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2007, 17h16   #12
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur Système
Inscription : décembre 2005
Messages : 9 774
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Ingénieur Système
Secteur : Transports

Informations forums :
Inscription : décembre 2005
Messages : 9 774
Points : 14 303
Points : 14 303
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
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 00h23   #13
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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 :
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.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 13h06   #14
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 428
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 428
Points : 2 815
Points : 2 815
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)
sekaijin 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 22h19.


 
 
 
 
Partenaires

Hébergement Web