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

Symfony PHP Discussion :

Doctrine : différence résultats entre helper et command [2.x]


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 54
    Points : 35
    Points
    35
    Par défaut Doctrine : différence résultats entre helper et command
    Bonjour à tous.

    J'ai un traitement d'envoi d'emails dans mon application.
    Je propose une date d'exécution à l'utilisateur, puis une Command exécute l'envoi via le CRON.
    Je propose également une relance qui est immédiate, donc via un controller (et un helper).

    Le problème est que les deux actions successives ne me retournent pas le même résultat alors que le code est exactement le même...

    J'ai l'impression que doctrine, via la Command me retourne une liste figée car admettons que je souhaite obtenir un objet Session avec des relations OneToMany.
    Si dans la fonction de mon repository, j'écris que je veux les Sessions qui ont un utilisateur qui commence par "M", lorsque je ferais une boucle sur les utilisateurs ( $sessions->getUtilisateurs() )je n'obtiendrais QUE les utilisateurs qui commencent par "M". Alors que via mon Helper, j'obtiendrai l'ensemble des utilisateurs.

    Egalement, si je ne fais pas le "LEFT JOIN s.utilisateurs" nécessaire, lorsque je fais par exemple un foreach($sessions->getUtilisateurs() as $utilisateurs), j'obtiens une erreur "Invalid argument supplied for foreach() ce qui n'est bien sûr pas le cas dans mon helper.

    Cela me rend fou, je ne comprend absolument pas pourquoi mon code via une Command ne me retourne qu'une image figée de ces objets.

    Auriez-vous une idée pour résoudre mon problème ?

  2. #2
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    Hugh man ! tu va sombrer dans la folie ....

    c'est le même environnement d’exécution celui en command et en web ?
    tu es sur quel OS ?



    (1) on peut récupérer la requête SQL qui a été créé par doctrine, donc affiche cette requête pour les 2 cas et compare ?

    (2) un var_dump() en sortie du repository donne quoi pour les 2 cas ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    C'est sur exactement le même poste, sur Windows.
    Pour le var_dump, tu veux dire pour la requête ou le résultat ?i

    Si c'est le résultat, dans mon helper j'obtiens mon objet session complet et dans ma Command un objet limité aux LEFT JOIN et WHERE appliqués (et en plus j'ai des erreurs, par exemple un utilisateur possède un manager et parfois le manager donné n'a rien à voir avec ce qu'il y a en base).

    La seule différence entre les deux Command et Helper est que dans la Command, je créé pas mal de choses avant l'envoi.
    Serait-il possible que ce soit un problème de cache trop plein ?

  4. #4
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    les 2.

    il faut comparer la requete SQL générée avec les 2 méthodes et aussi le résultat tant qu'à faire.

    tu peux voir la requete SQL créé dans le debug tool pour la version web


    et pour la version en ligne de commande, ajoute ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    protected function execute(InputInterface $input, OutputInterface $output)
        {
            // your code here
     
            // printing sql queries
            $logger = $this->getContainer()->get('monolog.logger.doctrine');
     
            foreach ($logger->getLogs() as $log)
            {
                $output->writeln(sprintf('Query: %s', $log['message']));
            }
        }

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    Pour la requête, elle est exactement identique.

    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
     
     
    SELECT 
      s0_.session_id AS session_id_0, 
      s0_.name AS name_1, 
      s0_.date_ouverture AS date_ouverture_2, 
      s0_.date_cloture AS date_cloture_3, 
      s0_.online AS online_4, 
      s0_.organisme_prestataire AS organisme_prestataire_5, 
      s0_.organisme_sous_traitant AS organisme_sous_traitant_6, 
      s0_.created_at AS created_at_7, 
      s0_.interface_qb AS interface_qb_8, 
      s0_.exclue_campagne_mail AS exclue_campagne_mail_9, 
      s1_.session_questionnaire_id AS session_questionnaire_id_10, 
      s1_.name AS name_11, 
      s1_.type AS type_12, 
      s1_.date_debut AS date_debut_13, 
      s1_.date_fin AS date_fin_14, 
      s1_.created_at AS created_at_15, 
      s1_.afficher_reponses AS afficher_reponses_16, 
      s1_.auto_correct AS auto_correct_17, 
      s1_.envoi_auto_mail AS envoi_auto_mail_18, 
      s1_.date_envoi_auto_mail AS date_envoi_auto_mail_19, 
      s1_.envoi_auto_relance AS envoi_auto_relance_20, 
      s1_.date_envoi_auto_relance AS date_envoi_auto_relance_21, 
      s1_.commentaire AS commentaire_22, 
      q2_.questionnaire_id AS questionnaire_id_23, 
      q2_.name AS name_24, 
      q2_.image AS image_25, 
      q2_.online AS online_26, 
      q2_.tempsEstime AS tempsEstime_27, 
      q2_.created_at AS created_at_28, 
      e3_.evaluation_id AS evaluation_id_29, 
      e3_.avancement AS avancement_30, 
      e3_.note AS note_31, 
      e3_.temps AS temps_32, 
      e3_.token AS token_33, 
      e3_.created_at AS created_at_34, 
      e3_.envoi_mail AS envoi_mail_35, 
      e3_.envoi_relance AS envoi_relance_36, 
      p4_.participant_id AS participant_id_37, 
      p4_.version AS version_38, 
      p4_.uuid AS uuid_39, 
      p4_.matricule AS matricule_40, 
      p4_.civilite AS civilite_41, 
      p4_.name AS name_42, 
      p4_.firstname AS firstname_43, 
      p4_.code_emploi AS code_emploi_44, 
      p4_.emploi AS emploi_45, 
      p4_.email AS email_46, 
      p4_.date_naissance AS date_naissance_47, 
      p4_.lieu_naissance AS lieu_naissance_48, 
      p4_.created_at AS created_at_49, 
      p4_.updated_at AS updated_at_50, 
      p5_.participant_id AS participant_id_51, 
      p5_.version AS version_52, 
      p5_.uuid AS uuid_53, 
      p5_.matricule AS matricule_54, 
      p5_.civilite AS civilite_55, 
      p5_.name AS name_56, 
      p5_.firstname AS firstname_57, 
      p5_.code_emploi AS code_emploi_58, 
      p5_.emploi AS emploi_59, 
      p5_.email AS email_60, 
      p5_.date_naissance AS date_naissance_61, 
      p5_.lieu_naissance AS lieu_naissance_62, 
      p5_.created_at AS created_at_63, 
      p5_.updated_at AS updated_at_64, 
      s0_.campagne_id AS campagne_id_65, 
      s0_.formation_id AS formation_id_66, 
      s0_.formateur_id AS formateur_id_67, 
      s0_.niveau_id AS niveau_id_68, 
      s1_.questionnaire_id AS questionnaire_id_69, 
      s1_.session_id AS session_id_70, 
      q2_.groupe_id AS groupe_id_71, 
      q2_.questionnaire_type_id AS questionnaire_type_id_72, 
      e3_.questionnaire_id AS questionnaire_id_73, 
      e3_.session_questionnaire_id AS session_questionnaire_id_74, 
      e3_.session_id AS session_id_75, 
      e3_.participant_id AS participant_id_76, 
      p4_.manager_id AS manager_id_77, 
      p4_.user_id AS user_id_78, 
      p4_.niveau_id AS niveau_id_79, 
    FROM 
      session s0_ 
      LEFT JOIN session_questionnaire s1_ ON s0_.session_id = s1_.session_id 
      LEFT JOIN questionnaire q2_ ON s1_.questionnaire_id = q2_.questionnaire_id 
      LEFT JOIN evaluation e3_ ON s1_.session_questionnaire_id = e3_.session_questionnaire_id 
      LEFT JOIN participant p4_ ON e3_.participant_id = p4_.participant_id 
    WHERE 
      s1_.session_questionnaire_id IN (?) 
      AND (
        e3_.avancement IS NULL 
        OR e3_.avancement LIKE ?
      ) 
      AND p4_.manager_id = ?

  6. #6
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    et le résultat, var_dump() sur les 2 ?

    sans l'afficher ici, tu vois que c'est Exactement pareil ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    Non justement.

    Pour l'un le Helper j'aurai par exemple :
    Session1
    Util1
    Util2
    Util3

    Pour la Command
    Session1
    Util3

    Car Util3 correspond à mon where util.manager_id = ?




    J'ai refait une deuxième command qui se comporte de la même façon que le Helper (car l'envoi initial créé des évaluations avant de faire l'envoi) histoire de voir si le problème vient du cache.
    J'obtiens le même résultat, comme si Doctrine avait un comportement différent dans une Commande.

  8. #8
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    c'est alors une histoire de donnée dans les ?

    parceque :
    AND p4_.manager_id = ? ("toto")

    et

    AND p4_.manager_id = ? ("tintin")


    ---> forcement c'est différent.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    Autre exemple :

    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
     
     $query = $this->getEntityManager()->createQuery(
                    'SELECT s, sq, e, p
                     FROM quizzwebBundle:Session s
                     LEFT JOIN s.sessionQuestionnaires sq
                     LEFT JOIN sq.questionnaire q
                     LEFT JOIN sq.evaluations e
                     LEFT JOIN e.participant p
                     WHERE sq IN ( :sessionQuestionnaires )
                     AND p.manager = :manager
                    '
            );
     
            $query->setParameter( 'manager', $manager);
            $query->setParameter( 'sessionQuestionnaires', $session_questionnaires );
     
            return $query->getResult();
    Lorsque je parcours mes utilisateurs pour chaque session, j'obtiens des résultats (parfois erronés)

    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
     
     $query = $this->getEntityManager()->createQuery(
                    'SELECT s
                     FROM quizzwebBundle:Session s
                     LEFT JOIN s.sessionQuestionnaires sq
                     LEFT JOIN sq.questionnaire q
                     LEFT JOIN sq.evaluations e
                     LEFT JOIN e.participant p
                     WHERE sq IN ( :sessionQuestionnaires )
                     AND p.manager = :manager
                    '
            );
     
            $query->setParameter( 'manager', $manager);
            $query->setParameter( 'sessionQuestionnaires', $session_questionnaires );
     
            return $query->getResult();
    => je n'ai plus de participants !

    Doctrine dans ma commande gère donc bien une liste d'objets liés à mon Select, comme si une fois la requête terminé il m'était impossible d'en refaire d'autre et qu'il se contentait du cache.

  10. #10
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $query->setParameter( 'manager', $manager);
     $query->setParameter( 'sessionQuestionnaires', $session_questionnaires );
    si bien sur, tu as vérifié que $manager et $session_questionnaires est Exactement pareil dans les 2 cas.



    et bien, je laisse d'autres te répondre ......

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    J'ai trouvé la source de mon problème (et sa solution).

    Dans une Command, doctrine ne rafraîchie pas le cache suite à une requête, contrairement à mon Helper.
    Il a donc fallut que je fasse un $em->detach() sur chaque évaluation de chaque questionnaire de chaque session (!!) pour le forcer à se mettre à jour.


  12. #12
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Peut tu rajouter un à ton query builder (celle qui déconne):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query->useResultCache(false);
    Je suis Développeur Senior ouvert aux opportunités
    Mon blog

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    Non cela ne change rien.

  14. #14
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par eluus Voir le message
    Non cela ne change rien.


    même ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $query->useQueryCache(false);
    $query->useResultCache(false);
    $query->setResultCacheLifetime(0);
    Je suis Développeur Senior ouvert aux opportunités
    Mon blog

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    Non plus...
    Seulement le detach(). Vous comprenez maintenant pourquoi cela me rendait fou ?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/07/2010, 10h27
  2. [AC-2000] Différence de résultat entre acpreview et Print d'un état
    Par riri2938 dans le forum IHM
    Réponses: 0
    Dernier message: 20/02/2010, 15h50
  3. [Débutant] Différences de résultats entre MATLAB 6.5 et 7.8
    Par Caps59 dans le forum MATLAB
    Réponses: 21
    Dernier message: 16/03/2009, 15h04
  4. Différence de résultat entre MATLAB et Scilab
    Par ABN84 dans le forum MATLAB
    Réponses: 1
    Dernier message: 10/05/2008, 22h53
  5. Différence de résultats entre requêtes SQL et Criteria
    Par titoudemtl dans le forum Hibernate
    Réponses: 3
    Dernier message: 07/08/2006, 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