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 Doctrine affiche qu'un seul résultat !?


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 51
    Par défaut Jointure Doctrine affiche qu'un seul résultat !?
    Bonsoir,

    Dans mon template show, j'essaye d'afficher le résultat de ma jointure et je n'affiche qu'un résultat ! Pourtant dans la barre de débug, la requette MySQL retourne bien plusieurs résultats dans PHPmyAdmin

    Mon shema:
    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
    ForumMessage:
      connection: doctrine
      tableName: forum_message
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        id_subject:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        message:
          type: string()
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        date:
          type: timestamp(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
    ForumSubject:
      connection: doctrine
      tableName: forum_subject
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        title:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        author:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        hit:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          default: '0'
          notnull: false
          autoincrement: false
        date:
          type: timestamp(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        numb_response:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          default: '0'
          notnull: false
          autoincrement: false
        slug_title:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        online:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          default: '0'
          notnull: false
          autoincrement: false
      relations:
        ForumMessage:
          local: id
          foreign: id_subject
          type: many
    Dans mon action Show je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->messages = Doctrine::getTable('ForumSubject')->getAllMessages($request->getParameter('id'));
    et dans mon template par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php foreach ($messages as $message): ?>
    ...<td><?php echo $message->getAuthor() ?></td>
    ...<td><?php echo $message->getMessage() ?></td>
    <?php endforeach; ?>
    et j'ai bien "Author" & "Message" qui sont 2 colonnes dans mes 2 tables respectives preuvent que la liaison fonctionne ! Mais au lieu d'afficher 2 résultats, j'en ai qu'un.
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->messages = Doctrine::getTable('ForumSubject')->find(array($request->getParameter('id')));
    et là, j'ai l'erreur
    Call to a member function getId() on a non-object
    Alors je sais plus quoi faire pour afficher mes 2 lignes !

    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
    Et si tu fais ta requête dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $this->messages = Doctrine_Query::create()
        ->from('ForumSubject s')
        ->leftJoin('s.ForumMessage m')
        ->where('like ?', $request->getParameter('id') )
        ->execute();

  3. #3
    Membre éclairé

    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 51
    Par défaut
    Bjr Mimi68,

    Si je fais ta requette en ajoutant les alias dans select, sinon j'ai des erreurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        ->select('*, m.id AS id, m.id_subject AS id_subject, m.message AS message, m.date AS date_response, s.title AS title, s.author AS author, s.hit AS hit, s.date AS date_subject')
        ->from('ForumSubject s')
        ->leftJoin('s.ForumMessage m')
        ->where('m.id_subject = ?', $request->getParameter('id') )
        ->execute();
    je n'ai qu'un résultat. Par contre en inversant (rightJoin ne fonctionnant pas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        $this->messages = Doctrine_Query::create()
            ->select("*, m.id_subject AS id_subject, m.id AS id, m.date AS date_response, s.title AS title, s.author AS author, s.hit AS hit, s.date AS date_subject")
            ->from("ForumMessage m")
            ->leftJoin("m.ForumSubject s")
            ->where('m.id_subject = ? ', $request->getParameter('id'))
            ->execute();
    j'ai bien deux résultats

    je suis encore paumé avec les jointures avec Doctrine, mais j'ai au moins compris une chose : pour accéder aux méthodes magique GET, il fallait bien déclarer les alias dans 'select' surtout quand on a 2 champs 'date' dans les 2 tables

    Il me reste plus qu'a faire le formulaire qui va avec la jointure...

    Merci

  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 n'ai jamais trop utilisé les méthodes magiques, sauf pour des truc très, très simple.

    J'avais mal lu le schéma. Une version allégée et corrigée :
    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
     
    message:
      tableName:                   forum_message
      actAs:
        timestampable
      columns:
        subject_id:                   integer
        message:                    string()
      relations:
        subject:
          local:                         subject_id
          foreign:                     id
          foreignAlias:              messages
     
    subject:
      tableName:                    forum_subject
      actAs:
        timestampable
      columns:
        title:                            string(255)
        author:                        string(45)
        hit:
          type:                         integer(4)
          default:                      0
        numb_response:
          type:                          integer(4)
          default:                      0
        slug_title:                     string(45)
        online:
          type:                         integer(4)
          default:                     0
    • Sauf si tu gères plusieurs connexion, mettre le nom de la connexion n'a aucun intérêt.
    • Les id sont virés, doctrine va les générer tous seul mais avec integer (integer (8) ) en fait.
    • Le préfixe forum disparait, sauf dans un très grand schéma, il surcharge inutilement le modèle et n'ajoute rien à la compréhension de l'ensemble (par contre, on peut le laisser pour le nom physique de la table.
    • Les liaisons passent donc en integer et le nom passe à la sauce doctrine table_id
    • Toutes les valeurs par défaut disparaisse, elle surchargent le schéma inutilement.
    • Si il n'y a que le type, il passe sur la même ligne que le champ, on gagne en place.
    • La date disparait de la table Message, elle est remplacé par un actAs qui va automatiquement générer et mettre à jour deux date created_at et update_at.
    • La description de la table message passe donc de 31 à 7 lignes avec une fonctionnalité en plus (update_at)
    • Je ne sais pas ce que "online" signifie, mais je pense qu'un type booléan serait plus adapté. Ou un timestamp qui donnerait le dernier accès ?
    • La relation est passée du côté unitaire (c'est plus simple à déclarer), le type a disparu (par défaut il est de 0-n), j'ai rajouté un foreingAlias pour plus de clarté.


    D'un objet $subject on va récupérer une collection d'enregistrement (doctrine_collection) des messages par $subject->messages()

    D'un objet $message, on récupèrera le sujet (doctrine_record) par $message->getSubject(). Et on récupèrera le titre du sujet par $message->getSubject()->getTitre().

    La requête devient alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        $this->messages = Doctrine_Query::create()
            ->from("Message m")             // avec M a Message, c'est un objet du modèle qui est utilisé, pas le nom d'une table
            ->leftJoin("m.Subject s")
            ->where('s.id = ? ', $request->getParameter('id'))
            ->execute();
    Il n'y a pas de clause select, dans ce cas Doctrine renvoie tous les champs.

  5. #5
    Membre éclairé

    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 51
    Par défaut
    bjr mimi68,

    Merci pour toutes tes précieuses info., par contre même si je suis daccord pour alléger le schema, afin d'éviter d'être obligé de l'imprimer sur une ramette de papier , je pense qu'il faut laisser plus de détails, car si je fais un
    [php] symfony doctrine:build --sql
    , afin de générer le fichier date/sql/schema.sql, qui peut être bien pratique, j'ai l'erreur "Undefined index" !? Alors l'erreur vient elle du shema.yml ? Je cherche...

  6. #6
    Membre éclairé

    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 51
    Par défaut
    ... je cherche et je viens de m'appercevoir en supprimant les modèles dans lib/model/doctrine/ et en faisant un
    [php] symfony doctrine:build --model
    , que Doctrine lisait mes fichiers de backup yml dans le repertoire config/doctrine/ !!! La gaffe
    En fin de compte je vais me coucher moins bête ce soir Je peux maintenant décomposer mes shemas dans plusieurs fichiers, pratique ! non ?
    Après Doctrine crée le fichier sql en ordonant les tables par ordre alphabétique !

    Donc la dernière version du shema est, avec quand même le nom des colonnes : created_at et updated_at, afin d'avoir le bon fichier SQL, ainsi que la colonne is_activated, peut être plus claire que "online" :
    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
    Message:
      tableName: forum_message
      actAs:
        timestampable
      columns:
        subject_id:      integer
        message:      string()
        created_at: timestamp
        updated_at: timestamp
      relations:
        subject:
          local:    subject_id
          foreign:  id
          foreignAlias:  messages
    Subject:
      tableName: forum_subject
      actAs:
        timestampable
      columns:
        title:      string()
        author:     string(45)
        hit:      integer(4)
        created_at: timestamp
        updated_at: timestamp
        numb_response: integer(4)
        slug_title:      string(255)
        is_activated: { type: boolean, default: 1 }
    Et cette fois ci en faisant "doctrine:build --sql", j'ai bien le fichier SQL suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE forum_message (id BIGINT AUTO_INCREMENT, subject_id BIGINT, message TEXT, created_at DATETIME, updated_at DATETIME, INDEX subject_id_idx (subject_id), PRIMARY KEY(id)) ENGINE = INNODB;
    CREATE TABLE forum_subject (id BIGINT AUTO_INCREMENT, title TEXT, author VARCHAR(45), hit INT, created_at DATETIME, updated_at DATETIME, numb_response INT, slug_title VARCHAR(255), is_activated TINYINT(1) DEFAULT '1', PRIMARY KEY(id)) ENGINE = INNODB;
    ALTER TABLE forum_message ADD CONSTRAINT forum_message_subject_id_forum_subject_id FOREIGN KEY (subject_id) REFERENCES forum_subject(id);
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    symfony doctrine:build --all --and-load
    symfony doctrine:generate-module --with-show --non-verbose-templates frontend forum Subject
    et cette fois-ci ta requette
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $this->messages = Doctrine_Query::create()
            ->from("Message m")             // avec M a Message, c'est un objet du modèle qui est utilisé, pas le nom d'une table
            ->leftJoin("m.subject s") // et subject le nom de l'alias
            ->where('s.id = ? ', $request->getParameter('id'))
            ->execute();
    avec une petite correction à la ligne : leftJoin("m.subject s"), subject sans S majuscule, car sinon j'ai une erreur qui me dit qu'il n'y a pas d'alias "Subject"... et cette fois-ci l'affichage de mes 2 lignes de test est bonne et je peux faire un $messages->getSubject()->getAuthor()


    Maintenant reste plus qu'a faire la liaison dans les formulaires

    Merci

Discussions similaires

  1. Jointure avec un seul résultat renvoyé
    Par gui80 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 09/03/2012, 14h18
  2. [Toutes versions] Afficher un seul résultat dans un état à partir d'un formulaire
    Par viventus dans le forum VBA Access
    Réponses: 0
    Dernier message: 30/04/2009, 12h05
  3. Afficher le ratio du résultat de deux requêtes
    Par decour dans le forum Access
    Réponses: 25
    Dernier message: 07/11/2005, 19h54
  4. Réponses: 2
    Dernier message: 14/10/2005, 17h21
  5. Jointure;comment afficher les enregs "non doubles"
    Par Wismerill dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 09h30

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