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 :

[doctrine] Requête avec une jointure


Sujet :

ORM PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut [doctrine] Requête avec une jointure
    bonjour,

    j'aimerait savoir comment gérer une requette doctrine avec symfony (géré clé étrangére) par exemple traduire cette requette vers doctrine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from clientt,fac where clientt.idclientt=fac.idclient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    clientt (idclient,...)
    fac (idclient,num_fac,...)
     
    ALTER TABLE `fac`
    ADD CONSTRAINT `fac_ibfk_1` FOREIGN KEY (`idclient`) REFERENCES `clientt` (`idclientt`);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    lib/model/doctrine/ClienttTable.class :
     
    public function column(){
    $q = Doctrine_Query::create()
    ->select('c.*,f.*')
    ->from('clientt c, fac f')
    ->where('c.idclientt=f.idclient);
     
     
    return $q->execute();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    actions.class.php :
     
    $this->clientts = Doctrine::getTable('Clientt')->column(); //appel a fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    indexSuccess.php :
     
    <?php foreach ($clientts as $clientt): ?>
    <tr>
     
    <td><?php echo $clientt->getFac()->getIdclient() ?></td> //recupérer champ de la table fac
     
    <td><?php echo $clientt->getDatee() ?></td> //recupérer champ de la table client
     
    <?php endforeach; ?>

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    C'est une question bien mystérieuse avec du code jeté comme un peu au hasard en espérant pouvoir en faire quelque chose...

    A priori la requête sql laisse supposer une liaison entre les tables clientt et fac. Par contre, la contrainte donnée : "clientt.idclientt=fac.idclient" laisse supposer un schéma peu orthodoxe et qui mériterait d'être optimiser pour un bon fonctionnement avec symfony.

    Supposons que le liens entre client et vas soit correctement définit. Supposons que un client puisse avoir plusieurs facture. Dans ce cas le liens entre les deux tables devrait être : "facs".

    Donc notre requête en DQL devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $q = Doctrine::getTable('clientt')->
              createQuery('c')->
              innerJoint('c.facs');
    Il sera peut-être bénéfique de donner le shema.yml pour qu'il profite d'une relecture préalable au développement de l'application et par la même occasion un brin de toilettage qui lui permettrait de mieux survivre à la dure vie d'un schéma dans le monde informatique.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut
    bonjour,
    j'ai essayé le code que tu m'a fourni et il me donne l'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unknown relation alias fac
    voila la partie consérner de mon shéma:
    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
    Clientt:
      connection: doctrine
      tableName: clientt
      columns:
        idclientt:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        nomclient:
          type: string()
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        numclientt:
          type: string()
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        datee:
          type: date(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Fac:
          local: idclientt
          foreign: idclient
          type: many
    Fac:
      connection: doctrine
      tableName: fac
      columns:
        idclient:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        numfac:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        nom:
          type: string()
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        datee:
          type: date(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Clientt:
          local: idclient
          foreign: idclientt
          type: one

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    C'est normal que cela ne marche pas...

    Mon message commençait par : "supposons", ce qui veux bien dire que le code ne peut être juste, sauf miracle...

    Ton schéma revu et corrigé "à 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
     
    Clientt:
      connection: doctrine
      tableName: clientt
      columns:
        nomclient:
          type: string()
          notnull: true
        numclientt:
          type: string()
          notnull: true
        datee:
          type: date
          notnull: true
     
    Fac:
      connection: doctrine
      tableName: fac
      columns:
        client_id:
          type: integer
          notnull: true
        nom:
          type: string()
          notnull: true
        datee:
          type: date
          notnull: true
      relations:
        Clientt:
          foreignAlias: Facs
    • J'ai laissé le nom "clientt" avec deux "t" bien que je n'en voie pas l'intérêt.
    • Doctrine crée le id seul autant le laisser faire. Il génère alors un champ id de type bigint auto incrémenté.
    • Les arguments on false comme valeur par défaut, inutile de les indiquer.
    • La relation ne se défini que sur un des objets, en principe celui du côté "n" de la relation "1-n". Si les conventions de nom sont conservées, il suffit de préciser l'argument foreignAlias (nom inverse de la relation).


    Avec ce modèle, mon code fonctionnera.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  5. #5
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut
    bonjour, merci pour t'a réponse et pour le temps fournis de t'a part. j'ai bien compris t'a solution mais la question est :

    moi je gère le schéma avec des commande comme :
    symfony doctrine:build-schema

    donc l'alias que t'a ajouter je doit l'ajouter manuellement ?

    et concernent le champ ID que doctrine le créa automatiquement .je veux que d'après le schéma qui est basé sur la BD ou j'ai définie foreign key .que je récupérer les donné des champ des deux table directement avec simple requette sous doctrine??

    désolé de t'avoir embêté avec se genre de question.merci

Discussions similaires

  1. requête avec une jointure
    Par ledisciple dans le forum Requêtes
    Réponses: 5
    Dernier message: 25/03/2013, 12h13
  2. Réponses: 0
    Dernier message: 26/04/2011, 16h15
  3. une requête avec deux jointures
    Par rinuom99 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 18/12/2009, 20h11
  4. Une requête avec des jointures externes
    Par Sopra dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/07/2009, 17h28
  5. Requête avec une jointure multitables
    Par thefleo dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/02/2009, 09h07

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