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 :

Écrire une jointure entre plusieurs tables avec le modèle MVC et Zend en PHP5


Sujet :

Zend_Db PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 45
    Par défaut Écrire une jointure entre plusieurs tables avec le modèle MVC et Zend en PHP5
    Bonjour,

    J'ai lu les cours sur Zend et le MVC
    je vois comment faire des select.

    Mais je vois pas comment faire des jointures...
    j'ai par exemples 3 tables:
    table 1: id_ville, nom_ville, adresse
    table 2: id_region, nom_region, note
    table 3: id_ville, id_region

    J'ai fait des modèles pour mes tables:
    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
    <?php
    class Ville extends Zend_Db_Table_Abstract
    {
    	protected $_name = 'table1_ville';
     
    	protected $_dependentTables = array('table3_RegionVille', 'Region');
    }?>
     
    <?php
    	class Region extends Zend_Db_Table_Abstract
    	{
    		protected $_name = 'table2_region';
    		protected $_dependentTables = array(
    			'table3_RegionVille');
    	}
     
    ?>
     
    <?php
    	class table3_RegionVille extends Zend_Db_Table_Abstract
    	{
    	    protected $_name = 'table3_RegionVille';
     
    	    protected $_referenceMap    = array(
    	        'rule_ville' => array(
    	            'columns'           => 'id_ville',
    	            'refTableClass'     => 'table1_ville',
    	            'refColumns'        => 'id_ville'
    	        ),
    	        'rule_region' => array(
    	            'columns'           => 'id_region',
    	            'refTableClass'     => 'table2_region',
    	            'refColumns'        => 'id_region'
    	        )
    	    );
    	}
     
    ?>
    A partir de ces modèles, j'arrive à faire un select dans mon controlleur, du genre:
    controlleur.php->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function indexAction()
    {
    $select = $this->table2_region->select();	       
    $this->view->table2_region=$this->table2_region->fetchAll($select);    
    $this->render();
    }
    Mais je ne vois pas comment faire une jointure :s


    par exemple afficher toutes les villes de chaque région... en tenant compte du MVC et de ZEND...
    car la requête sql en tant que tel ne me pose pas de probleme, j'obtiendrais un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete="select v.id_ville, v.nom_ville from table1_ville v, table2_region r, table3_RegionVille rv where v.id_ville=rv.id_ville and rv.id_region=r.id_region group by r.id_region";
    Quelqu'un pourrait-il me montrer comment faire la jointure en tenant compte des modèles (MVC) et du framework Zend?



    Merci d'avance de votre aide

  2. #2
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 57
    Par défaut
    Bonjour,

    Je ne suis pas un spécialiste du framework mais je pense qu'il y a plusieurs solutions à ton problème :
    je n'ai pas testé mais si tu utilise des objet Zend_Db_Table il y a des méthodes comme find qui prennent en compte les relations entre tables.
    Tu peux sinon je crois passer par un objet Zend_Db_Select qui est souple d'utilisation et dans lequel tu peux ajouter des clauses from, where etc.
    Dans le pire des cas tu peux passer n'importe quelle requète à ton adapter. Je pense que $ton_adapter->fetchAll(ta_requète) doit fonctionner.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    1) Si une ville n'appartient qu'à une région, ton modèle est incorrect : la table3 est inutile.
    2) Sinon, voici une solution à placer dans le modèle de ta table1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $db = $this->getAdapter();
     
    // renvoie toutes les villes de toutes les régions        
    $select = $db->select()
        ->from('table3')
        ->joinInnerUsing('table1', 'idVille')
        ->joinInnerUsing('table2', 'idRegion')
        ->order(array('table2.nom_region', 'table1.nom_ville'));
     
    $stmt = $select->query();
    return $stmt->fetchAll();

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 45
    Par défaut
    Merci pour vos réponses
    ça eclaircit plus mes idées que par rapport aux autres exemples quej'ai pu lire avant.

    Une autre requête que je n'arrive pas à implementer avec Zend et le modele MVC
    est une requete imbiqué avec un IN.

    exemple : j'ai ma table 4 (ville gagnante): id_gagnant, nom_ville, statut
    J'aimerais récuperer le nom des villes gagnantes qui se prenomme 'Aix' qui font partie de la région: "Provence"
    j'arrive à faire en sql:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select g.nom_ville
    from table4_gagnant g
    where g.nom_ville like 'Aix'
    and g.nom_ville IN
    (select 
    select  v.nom_ville 
    from table1_ville v, table2_region r, table3_RegionVille rv 
    where r.nom_region like 'Provence'
    and v.id_ville=rv.id_ville 
    and rv.id_region=r.id_region
    )
    ps: ne faite pas attention à l'exemple en tant que tel, j'aimerais juste savoir comment traduire ça avec Zend et le modele MVC (via les modèles dans le message précédent)


    Merci d'avance de votre aide

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 45
    Par défaut
    Comme je n'ai tjs pas trouvé comment faire un IN imbriqué

    j'essaye de faire autrement:

    j'utilise tjs mes modeles. J'ai ceci comme requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $select = $this->table3_RegionVille->select()
                 ->from(array('h_hg' => $this->table3_RegionVille))
                 ->from(array('hg' => $this->table2_region))
                 ->from(array('h' => $this->table1_ville))
                 ->where('id_region = ?', $this->region)
                 ->where('nom_ville like ?', $nom_villeville)
                 ->where('hg.id_region= h_hg.id_region')
                 ->where('h_hg.id_ville= h.id_ville');             
     
    			$stmt = $select->query();
    			return $stmt->fetchAll();
    Puis-je structurer ma requête comme cela? (à voir la doc, je suppose)
    mais il met me ceci comme erreur:
    Exception : Zend_Db_Statement_Exception Message : SQLSTATE[42000]: Syntax error or access violation: 1065 Query was empty
    Quelqu'un pourrait-il m'eclaircir?


    merci d'avance

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Peux tu nous dire ce que renvoie un $select->__toString() ?

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/04/2015, 11h15
  2. Réponses: 3
    Dernier message: 20/09/2013, 10h07
  3. Réponses: 3
    Dernier message: 01/04/2010, 10h04
  4. Problème de Jointure entre plusieurs tables
    Par Stouille89 dans le forum JDBC
    Réponses: 12
    Dernier message: 11/12/2007, 14h16
  5. Optimisation d'une jointure entre 3 tables
    Par gavelin dans le forum Langage SQL
    Réponses: 4
    Dernier message: 14/12/2005, 09h52

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