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

ORM PHP Discussion :

Jointure quand tu nous tiens [Doctrine]


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut Jointure quand tu nous tiens
    Bonjour,

    A l'aide du schéma suivant :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    Offre:
      actAs:
        Sluggable:
          fields:       [intitule]
          unique:       true
      tableName:        gbot_offre
      columns:
        id:
          type:         integer
          primary:      true
        file:
          type:         string(255)
          notnull:      true
        contact_id:
          type:         integer
        intitule:
          type:         string(255)
          notnull:      true
        organisme_id:
          type:         integer
          notnull:      true
        modalite_enseignement_id:
          type:         integer
        objectif_general_id:
          type:         integer
        nombre_heures_total:
          type:         integer
          notnull:      true
        niveau_entree_id:
          type:         integer
        conventionnement:
          type:         boolean
        prise_en_charge_frais:
          type:         boolean
        certifiante:
          type:         boolean
        info_derniere_minute:
          type:         string(4000)
        objectif_detaille:
          type:         string(3000)
          notnull:      true
        contenu:
          type:         string(3000)
          notnull:      true
        public_vise_id:
          type:         integer
        conditions_prise_en_charge:
          type:         string(3000)
          notnull:      true
      relations:
        Organisme:
          onDelete:     CASCADE
          alias:        organisme
          foreignAlias: offres
        ModaliteEnseignement:
          onDelete:     SET NULL
          alias:        modalite_enseignement
          foreignAlias: offres
        ObjectifGeneral:
          onDelete:     SET NULL
          alias:        objectif_general
          foreignAlias: offres
        NiveauDiplome:
          local:        niveau_entree_id
          onDelete:     SET NULL
          alias:        niveau_entree
          foreignAlias: offres
        Contact:
          onDelete:     SET NULL
          alias:        contact
          foreignAlias: offres
        PublicVise:
          onDelete:     SET NULL
          alias:        public_vise
          foreignAlias: offres
     
    Session:
      tableName:        gbot_session
      columns:
        id:
          type:         integer
          primary:      true
        offre_id:
          type:         integer
          notnull:      true
        debut:
          type:         datetime
        fin:
          type:         datetime
        lieu_formation_id:
          type:         integer
          notnull:      true
      relations:
        Offre:
          onDelete:     CASCADE
          foreignAlias: sessions
        LieuFormation:
          alias:        lieu_formation
          onDelete:     CASCADE
          foreignAlias: sessions
     
    LieuFormation:
      tableName:        gbot_lieu_formation
      columns:
        nom:
          type:         string(100)
          notnull:      true
        adresse:
          type:         string(300)
          notnull:      true
        commune_id:
          type:         integer
          notnull:      true
        accesHandicap:
          type:         string(300)
      relations:
        Commune:
          onDelete:     CASCADE
          foreign:      code_insee
          alias:        commune
          foreignAlias: lieuxformation
     
    Commune:
      tableName:        gbot_commune
      actAs:
        Geographical:   ~
        Sluggable:
          fields:       [nom]
          unique:       true
      columns:
        code_insee:
          type:         integer
          primary:      true
        nom:
          type:         string(50)
          notnull:      true
        code_postal:
          type:         string(5)
          notnull:      true
        zone_emploi_id:
          type:         integer
        departement_id:
          type:         integer
      relations:
        Departement:
          onDelete:     SET NULL
          foreignAlias: communes
        ZoneEmploi:
          onDelete:     SET NULL
          foreignAlias: communes
    je voudrais écrire une requête de ce genre là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select offre.id, commune.nom
     from offre
    Inner join session on session.offre_id=offre.id
    Inner join lieuformation on lieuformation.id=session.lieu_formation_id
    Inner join commune on commune.codeInsee=lieuFormation.commune_id
    J'ai donc écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $q = $this->getOffresQuery()
                    ->innerJoin('g.sessions s ON s.offre_id = g.id')
                    ->innerJoin('s.lieu_formation l ON l.id = s.lieu_formation_id')
                    ->innerJoin('l.commune k ON l.commune_id = k.code_insee')
                    ->where('g.nombre_heures_total BETWEEN ? AND ?',array($criteres['dureeMin'],$criteres['dureeMax']))
                    ->andWhereIn('k.zone_emploi_id',$criteres['zone'])
                    ->orderBy('g.conventionnement DESC, g.intitule ASC');
    Donc c'est la partie des innerJoin qui m'intéresse, car quand je lance le programme, cela m'indique
    Unknown relation alias lieu_formation
    J'avoue être un peu perdu là, et si quelqu'un peut m'aider je lui serai reconnaissant...

    Merci d'avance

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Il faut utiliser les alias déclarés dans ton schema.yml, pas les noms de tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $q = $this->getOffresQuery()
                    ->innerJoin('g.sessions s ON s.offre_id = g.id')
                    ->innerJoin('s.LieuFormation l ON l.id = s.lieu_formation_id')
    [etc...]

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    Merci pour ta réponse, mais apparemment cela n'a pas résolu le problème.

    J'obtiens cette fois :

    Unknown relation alias LieuFormation
    Pour info, si je fais un echo $q j'obtiens :

    FROM Offre g LEFT JOIN g.organisme o ON g.organisme_id = o.id LEFT JOIN g.modalite_enseignement m ON g.modalite_enseignement_id = m.id LEFT JOIN g.objectif_general p ON g.objectif_general_id = p.id LEFT JOIN g.niveau_entree n ON g.niveau_entree_id = n.id LEFT JOIN g.contact c ON g.contact_id = c.id INNER JOIN g.sessions s ON s.offre_id = g.id INNER JOIN s.LieuFormation l ON l.id = s.lieu_formation_id INNER JOIN l.commune k ON l.commune_id = k.code_insee WHERE g.nombre_heures_total BETWEEN ? AND ? AND k.zone_emploi_id IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ORDER BY g.conventionnement DESC, g.intitule ASC

  4. #4
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Citation Envoyé par jekif Voir le message
    Merci pour ta réponse, mais apparemment cela n'a pas résolu le problème.
    En effet, je n'avais pas vu que justement, tu avais redéfini 'lieu_formation' comme alias pour la relation LieuFormation (dans Session). Autant pour moi

    Du coup, je ne vois pas bien ce qui cloche mais pour ma part, après avoir eu quelques soucis de de style, j'évite toujours de nommer en dur dans le code l'alias de la table de base. Si tu essayes quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $q = $this->getOffresQuery();
    $rootAlias = $q->getRootAlias();
    return $q->innerJoin("$rootAlias.sessions s ON s.offre_id = $rootAlias.id")
                    ->innerJoin('s.LieuFormation l ON l.id = s.lieu_formation_id')
    [etc...]
    est-ce que ça plante toujours ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    En fait, pour suivre ton premier conseil, j'avais retiré la définition en dur de l'alias lieu_formation.

    J'ai essayé la méthode du getRootAlias() mais toujours le même problème. J'avoue que m'arracher les cheveux là dessus.

    Ci-dessous l'intégralité de la méthode de recherche, des fois que le problème vienne d'ailleurs :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    public function search($criteres)
        {
           $q = $this->getOffresQuery();
           $rootAlias = $q->getRootAlias();
     
           $q->innerJoin("$rootAlias.sessions s ON s.offre_id = g.id")
                    ->innerJoin('s.LieuFormation l ON l.id = s.lieu_formation_id')
                    ->innerJoin('l.commune k ON l.commune_id = k.code_insee')
                    ->where('g.nombre_heures_total BETWEEN ? AND ?',array($criteres['dureeMin'],$criteres['dureeMax']))
                    ->andWhereIn('k.zone_emploi_id',$criteres['zone'])
                    ->orderBy('g.conventionnement DESC, g.intitule ASC');
     
           if ( !empty($criteres['intitule']) ) $q->andWhere('g.intitule = ?',$criteres['intitule']);
           if ( !empty($criteres['nivEntree']) ) $q->andWhere('g.niveau_entree_id = ?', $criteres['nivEntree']);
           if ( isset($criteres['conventionne']) && ($criteres['conventionne']==0 || $criteres['conventionne']==1 )) $q->andWhere('g.conventionnement = ?',$criteres['conventionne']);
           if ( !empty($criteres['objectif'])) $q->andWhere('g.objectif_general_id = ?', $criteres['objectif']);
     
           $offres_ids = array();
     
           // TODO prendre en charge l'arborescence des formacodes
           if ( !empty($criteres['formacode']))
           {
               $offres_ids = array_merge($offres_ids, Doctrine_Core::getTable('OffreFormacode')->getCodesRelatedOffres($criteres['formacode']));
               $use_offres_ids = true;
           }
           else if ( !empty($criteres['domaine']) )
           {
                if ( !empty($criteres['sousdomaine']) )
                {
                    $formacodes = Doctrine_Core::getTable('sousDomaine')->getById($criteres['sousdomaine'])->getFormacodesIds();
                }
                else
                {
                    //echo Doctrine_Core::getTable('Domaine')->getDomaine($criteres['domaine'])->getFormacodes();
                    $formacodes = Doctrine_Core::getTable('Domaine')->getDomaine($criteres['domaine'])->getFormacodes();
                }
                // On a les formacodes liés au sous domaine
                // on récupère les offres_id liés à ces formacodes
                $offres_ids = array_merge($offres_ids, Doctrine_Core::getTable('OffreFormacode')->getCodesRelatedOffres($formacodes));
                $use_offres_ids = true;
           }
     
           if ( !empty($criteres['rncp']) )
           {
               $offres_ids = array_merge($offres_ids, Doctrine_Core::getTable('Diplome')->getOffresFromRNCP($criteres['rncp']));
               $use_offres_ids = true;
           }
           else if ( isset($criteres['diplomant']) && ($criteres['diplomant']==0 || $criteres['diplomant']==1) )
           {
               $q->andWhere('g.certifiante = ?',$criteres['diplomant']);
           }
     
           $offres_ids = array_unique($offres_ids);
           if (!empty($use_offres_ids))
           {
               if (count($offres_ids)==0) return array();
               $q->whereIn('g.id',$offres_ids);
           }
     
    //       echo $q;
     
           return $q->execute();
        }

    PS. Non ça ne vient pas du reste du code que je viens de commenter (//) et le problème subsiste...

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    Bon, j'ai regénéré le modèle, tables etc... et apparemment ça a l'air de fonctionner. Je l'avais déjà fait pourtant...

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

Discussions similaires

  1. Jointure, Double Jointure Quand tu nous tiens
    Par petchos dans le forum Langage SQL
    Réponses: 23
    Dernier message: 15/05/2008, 13h07
  2. [AJAX] Ajax quand tu nous tiens
    Par Florent08800 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/08/2007, 21h38
  3. [FRAME] Quand tu nous tiens
    Par hisy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 07/07/2006, 08h27
  4. Regex quand tu nous tiens !!!
    Par calimero642 dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 14h33
  5. [object HTMLSelectElement] IE quand tu nous tiens
    Par NeHuS dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/03/2006, 08h26

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