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 :

Requete avec jointure [Doctrine]


Sujet :

ORM PHP

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 109
    Par défaut Requete avec jointure
    Salut a tous,

    J'ai un souci de requete avec Doctrine.

    Voici les tables du fichier YAML :

    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
    151
    152
    153
    154
    155
     
    Site:
      connection: doctrine
      tableName: site
      columns:
        idsite:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        st_nom:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        st_mode_acces_reseau:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        st_addresse:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        st_commentaire:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        entreprise_identreprise:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
     
    Batiment:
      connection: doctrine
      tableName: batiment
      columns:
        idbatiment:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        bat_nom:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        bat_etage:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        bat_commentaire:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        site_idsite:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Service:
          foreignAlias: Batiments
          class: Service
          refClass: BatimentHasService # Many To Many
          local:  batiment_idbatiment
          foreign: service_idservice
     
    Service:
      connection: doctrine
      tableName: service
      columns:
        idservice:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        svc_nom:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        svc_commentaire:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        Batiment:
          foreignAlias: Services
          class: Batiment
          refClass: BatimentHasService # Many To Many
          local:  service_idservice
          foreign:  batiment_idbatiment
        Personnel:
          foreignAlias: Services
          class: Personnel
          refClass: PersonnelHasService # Many To Many
     
     
    BatimentHasService:
      connection: doctrine
      tableName: batiment_has_service
      columns:
        batiment_idbatiment:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
        service_idservice:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
      relations:
        Batiment:
          local: batiment_idbatiment
          foreign: idbatiment
          foreignAlias: BatimentHasServices
        Service:
          local: service_idservice
          foreign: idservice
          foreignAlias: BatimentHasServices
    Pour récapituler :
    - Un site a plusieurs batiments ( mais un batiment n'appartient qu'a un site ) : One To Many
    - Un batiment peut contenir plusieurs service et reciproquement ( many to many )

    Je voudrais la liste des Service d'un site X.

    Ca devrait ressembler a un truc du genre si je me plante pas ( suis pas bon en sql ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * 
    FROM Service svc , Batiment b , BatimentHasService lien , Site s 
    WHERE  b.site_idsite = X
    AND svc.idservice = lien.service_idservice 
    AND b.idbatiment = lien.batiment_idbatiment
    Et je suis infoutu de l'ecrire en DQL , et le plus pénible c'est que la moindre erreur dans mon action plante tout et y'a pas trop moyen de debugger.

    Si quelqu'un connait le moyen de faire ca en DQL

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Ton shema revu à ma façon
    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
    #shema.yml (non testé)
    Site:
      tableName: site
      columns:
        # l'Id d'une table s'appelle toujours id. Si pas d'id créé, Doctrine le fait comme un grand, autant le laisser faire...
        #Pas de préfix du nom de la table sur un champ, il y est, dans la table...
        nom:
          type: string(45)
          notnull: true
        mode_acces_reseau:
          type: string(45)
        addresse:
          type: string(45)
        commentaire:
          type: string(45)
        entreprise_id:
          type: integer(4)
          notnull: true
     
    Batiment:
      tableName: batiment
      columns:
        nom:
          type: string(45)
          notnull: true
        etage:
          type: integer(4) #int(4) ça fait une sacrée tour ! :D
        commentaire:
          type: string(45)
        site_id: #clef de liaison = <nomDeLaTable>_id
          type: integer
          notnull: true
      relations:
        Service:
          foreignAlias: Batiments
          # Vu que maintenant, les précos sont respectée, il ne faut rien de plus pour une liaison 1-n
     
    Service:
      tableName: service
      columns:
        nom:
          type: string(45)
          notnull: true
        commentaire:
          type: string(45)
      relations:
        Batiments:
          foreignAlias: Services
          class: Batiment
          refClass: BatimentService # Many To Many
        Personnel:
          foreignAlias: Services
          class: Personnel
          refClass: PersonnelHasService # Many To Many
          # Lien non corrigé il n'y a pas les classes pour permettre d'être sur qu'il soit opérationnel.
     
    BatimentService:
      tableName: batiment_has_service
      columns:
        batiment_id:
          type: integer
          primary: true
        service_id:
          type: integer
          primary: true
      relations:
        Batiment:
          foreignAlias: BatimentServices
        Service:
          foreignAlias: BatimentServices
    Ta requete en DQL devient alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $q = Doctrine_Query::create()->
              from('Service s')->
              inerJoin('s.Batiments b')->
              innerJoin('b.Site')->
              where(b.nom = ?', $nomBatimentATrouverService );
    Mais je ne suis pas très sur de ta requête. Ni qu'elle va bien retourner ce que tu pourrais attendre en retour.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 109
    Par défaut
    Je vais devoir refaire entièrement le Yml , a la base il s'agit une conversion SQL -> YML mais ca rend pas bien du tout.

    Je pars redémarre le yml et je test ta solution. Je te donnerais les billes pour le many to many.

    merci et je repost sous peu.

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je dois déjà l'avoir écrit dans les 1000 fois...

    Sauf exception exceptionnellement rare, ne pas partir d'une base existante pour travailler sur un projet symfony 1.x

    La seul exception est si tu dois t'appuyer sur une base existante sans aucune possibilité de la faire évoluée.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 109
    Par défaut
    Me revoici,

    Bon effectivement c'est pas difficile mais c'est long.
    Voici la nouvelle mouture du schéma :

    ( petite image récapitulative : http://img851.imageshack.us/img851/3...2jun241505.jpg )
    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
     
     
    Entreprise:
      tableName: entreprise
      columns:
        nom:
          type: string(45)  
          notnull: true
        addresse:
          type: string(45)
        siret:
          type: string(45)
        raison_sociale:
          type: string(45)
        commentaire:
          type: string(45)
     
    Site:
      tableName: site
      columns:
        nom:
          type: string(45)
          notnull: true
        mode_acces_reseau:
          type: string(45)
        addresse:
          type: string(45)
        commentaire:
          type: string(45)
          autoincrement: false
        entreprise_id:
          type: integer
          notnull: true
      relations:
        Entreprise:
          foreignAlias: Sites # One to Many
     
    Batiment:
      tableName: batiment
      columns:
        nom:
          type: string(45)
          notnull: true
        etage:
          type: integer(4)
        commentaire:
          type: string(45)
        site_id:
          type: integer
          notnull: true
      relations:
        Site:
          foreignAlias: Batiments # One to Many
     
    Service:
      tableName: service
      columns:
        nom:
          type: string(45)
          notnull: true
        commentaire:
          type: string(45)
      relations:
        Batiment:
          foreignAlias: Services
          class: Batiment
          refClass: BatimentService # Many To Many
        Personnel:
          foreignAlias: Services
          class: Personnel
          refClass: PersonnelService # Many To Many
     
    BatimentService:
      tableName: batiment_has_service
      columns:
        service_id:
          type: integer
          primary: true
        batiment_id:
          type: integer
          primary: true
      relations:
        Batiment:
          foreignAlias: BatimentServices
        Service:
          foreignAlias: BatimentServices
     
    Personnel:
      tableName: personnel
      columns:
        nom:
          type: string(45)
        prenom:
          type: string(45)
        fonction:
          type: string(45)
        mail:
          type: string(45)
        num:
          type: string(45)
        naissance:
          type: datetime
        is_masculin:
          type: integer(1)
     
     
    PersonnelService:
      tableName: personnel_has_service
      columns:
        personnel_id:
          type: integer
          primary: true 
        service_id:
          type: integer
          primary: true 
      relations:
        Personnel:
          foreignAlias: PersonnelServices
        Service:
          foreignAlias: PersonnelServices
    Je souhaite toujours obtenir tous les services d'un site ( en fait réussir une jointure me suffirait après l'idée reste la même).

    Quand j'écris ça , ça foire déjà alors une jointure j'en parle pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $this->services = Doctrine_Query::create()
        ->from("Service")
    $this->services->getSqlQuery()
    Je dois passer a coté d'un truc simple avec le DQL je pense, si vous pouviez m'aider a mettre le doigt dessus.

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Dernières corrections proposées :
    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
    Entreprise:
      tableName: entreprise
      columns:
        nom:
          type: string(45)  
          notnull: true
        addresse:
          type: string(45)
        siret:
          type: string(45)
        raison_sociale:
          type: string(45)
        commentaire:
          type: string(45)
     
    Site:
      tableName: site
      columns:
        nom:
          type: string(45)
          notnull: true
        mode_acces_reseau:
          type: string(45)
        addresse:
          type: string(45)
        commentaire:
          type: string(45)
          autoincrement: false
        entreprise_id:
          type: integer
          notnull: true
      relations:
        Entreprise:
          foreignAlias: Sites # One to Many
     
    Batiment:
      tableName: batiment
      columns:
        nom:
          type: string(45)
          notnull: true
        etage:
          type: integer(4)
        commentaire:
          type: string(45)
        site_id:
          type: integer
          notnull: true
      relations:
        Site:
          foreignAlias: Batiments # One to Many
     
    Service:
      tableName: service
      columns:
        nom:
          type: string(45)
          notnull: true
        commentaire:
          type: string(45)
      relations:
        Batiments: # "s" vu qu'il y a plusieurs batiements ratachés à un service
          foreignAlias: Services # de la même manière plusieurs services attaché à un batiment
          class: Batiment
          refClass: BatimentService # Many To Many
        Personnels:
          foreignAlias: Services
          class: Personnel
          refClass: PersonnelService # Many To Many
     
    BatimentService:
      tableName: batiment_has_service
      columns:
        service_id:
          type: integer
          primary: true
        batiment_id:
          type: integer
          primary: true
      relations:
        Batiment:
          foreignAlias: BatimentServices
        Service:
          foreignAlias: BatimentServices
     
    Personnel:
      tableName: personnel
      columns:
        nom:
          type: string(45)
        prenom:
          type: string(45)
        fonction:
          type: string(45)
        mail:
          type: string(45)
        num:
          type: string(45)
        naissance:
          type: datetime
        is_masculin:
          type: integer(1)
     
     
    PersonnelService:
      tableName: personnel_has_service
      columns:
        personnel_id:
          type: integer
          primary: true 
        service_id:
          type: integer
          primary: true 
      relations:
        Personnel:
          foreignAlias: PersonnelServices
        Service:
          foreignAlias: PersonnelServices
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $q = Doctrine_Query::create()->
              from('site s')->
              innerJoin('s.batiments b')->
              innerJoin('b.services se')->
              where('s.id = ?', $idDuService);

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 109
    Par défaut
    Merci bien des corrections, décidément je l'ai pas fait assez de fois.

    Concernant la requete DQL : elle n'affiche rien, j'ai bien vérifié dans la base : j'ai des enregistrements qui correspondent.

    Donc je dois mal m'y prendre pour afficher dans la vue. Je met le résultat de la requête dans : Voici le code de la vue.

    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
    <table>
      <thead>
        <tr>
          <th>Nom</th>
          <th>Commentaire</th>
          <th>Action</th>
        </tr>
      </thead>
      <tbody>
        <?php  foreach ($services as $service): ?>
        <tr>
          <?php if (!$services) echo "Services null" ; ?>
          <td><?php echo $service->getNom() ?></td>
          <td><?php echo $service->getCommentaire() ?></td>
          <td><a href="<?php echo url_for('Service/edit?id='.$service->getId()) ?>"><?php echo Consulter ?></a></td>
        </tr>
        <?php endforeach; ?>
      </tbody>
    </table>
     
      <a href="<?php echo url_for('Service/new') ?>">Ajouter un service</a>
    Ça n'affiche pas null, mais ca n'affiche rien. Cela vous parait-il normal ?

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 109
    Par défaut
    -EDIT-

    Bon, j'ai du merdé dans mon test car ça marche enfin :

    Pour avoir tous les services d'un site je fais bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       	$this->services = Doctrine_Query::create()
        	->from("Service s")
        	->innerJoin("s.Batiments bat")
        	->innerJoin("bat.Site si")
        	->where("si.id = ?" , $id)
        	->execute();
    Merci beaucoup pour les conseils sur le schéma Michel, plus on est rigoureux a ce niveau moins ca merde après je le saurais pour la prochaine fois.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/02/2007, 13h46
  2. [ADO] Requete avec jointure
    Par okparanoid dans le forum Bases de données
    Réponses: 6
    Dernier message: 08/11/2006, 17h05
  3. recherche aide pour requete avec jointure
    Par nebil dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/08/2006, 17h03
  4. [MySQL] Erreur dans une requête avec jointures
    Par bobic dans le forum Langage SQL
    Réponses: 17
    Dernier message: 03/08/2006, 13h04
  5. requete avec jointure & group by
    Par de LANFRANCHI dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/07/2004, 14h31

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