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 :

Une histoire d'entité


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2013
    Messages : 71
    Points : 84
    Points
    84
    Par défaut Une histoire d'entité
    Bonjour,

    Vous trouverez ci-dessous un bout de code qui est censé faire la chose suivante :
    - initialiser un tableau
    - boucler 14 fois (c'est la valeur de $this->nblignes * $this->joursparligne)
    - Initialise la date du jour + la valeur de la boucle (donc à chaque passage, on augmente d'un jour en partant d'aujourd'hui)
    - Je cherche si une commandeDeRepas du midi a été faite sinon, il retourne une entité commandemidi vide
    - Je force la date de la commande à la date du jour + valeur de la boucle
    - je l'ajoute dans un tableau $commandes['midi'] qui contient mes 14 commandes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $commandes['midi'] = array();
     
    for ($i = 0; $i < ($this->nblignes * $this->joursparligne); $i++):
        $ladate = new \DateTime('+' . $i . 'day');
        $commandemidi = $this->get('repas.default.manager.commandemidi')->loadOneCommande($userOnline, $ladate);
        $commandemidi->setDateCommande($ladate);
     
        array_push($commandes['midi'], $commandemidi);
     
        unset($commandemidi);
        dump($commandes['midi']);
     
    endfor;
    On pourrait imaginer que le dump donnerait (version simplifié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
    array1 [
        0 => commandemidi
                    -dateCommande : Datetime('2015-11-18')
    ]
     
    array2 [
        0 => commandemidi
                    -dateCommande : Datetime('2015-11-18')
        1 => commandemidi
                    -dateCommande : Datetime('2015-11-19')
    ]
     
    array3 [
        0 => commandemidi
                    -dateCommande : Datetime('2015-11-18')
        1 => commandemidi
                    -dateCommande : Datetime('2015-11-19')
        2 => commandemidi
                    -dateCommande : Datetime('2015-11-20')
    ]
     
    etc.
    mais pas du tout , en fait, il donne :

    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
    array1 [
        0 => commandemidi
                    -dateCommande : Datetime('2015-11-18')
    ]
     
    array2 [
        0 => commandemidi
                    -dateCommande : Datetime('2015-11-19')
        1 => commandemidi
                    -dateCommande : Datetime('2015-11-19')
    ]
     
    array3 [
        0 => commandemidi
                    -dateCommande : Datetime('2015-11-20')
        1 => commandemidi
                    -dateCommande : Datetime('2015-11-20')
        2 => commandemidi
                    -dateCommande : Datetime('2015-11-20')
    ]
     
    etc.
    Soit j'ai vraiment foiré ma boucle, soit il y a un mécanisme de Symfony qui m'échappe.

    Merci pour vos indications.

  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
    je ne vois pas de problème à première vue.
    procédons par étape

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $commandes['midi'] = array();
     
    for ($i = 0; $i < ($this->nblignes * $this->joursparligne); $i++):
        $ladate = new \DateTime('+' . $i . 'day')   
        ...
       dump($ladate);
       ....  
     
        unset($ladate ); // à la fin du traitement on détruit la variable
    }
    si ça affiche les bons résultats, c'est que ton enregistrement bugue. ça donne quoi ?

  3. #3
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    J'ai essayé de clarifier ton code... y a pas mal de chose qui me paraissent pas utile.

    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
     
    <?php 
    $commandes['midi'] = array();
     
    //on extrait le calcul de l'incrémentation de la boucle, bonne pratique.
    $nbElements = $this->nblignes * $this->joursparligne;
    for ($i = 0; $i < $nbElements; $i++):{
        $ladate = new \DateTime('+' . $i . 'day');
        $commandemidi = $this->get('repas.default.manager.commandemidi')->loadOneCommande($userOnline, $ladate);
        //Si tu récupère ton élément par date, il me semble inutile de définir la ligne suivante la date de ce même element.
    	//$commandemidi->setDateCommande($ladate);
    	//pourquoi utiliser une méthode quand tu peux utiliser du language intuitif.
    	//array_push($commandes['midi'], $commandemidi);
     	$commandes['midi'][] = $commandemidi;
     
        //inutile, tu l'écrase l'itération suivante
    	//unset($commandemidi);
        dump($commandes['midi']);
    }
     
    //Pour ma part j'aurais écrit ca comme ca : 
    $commandes['midi'] = $this->get("CommandRepository")->getCommandes($userOnline, $dateMin, $dateMax);
     
    //Et dans le Repo un truc du genre : 
    public function getCommandes($userOnline, $duree){
    	$qb = $this->getEntityManager()->createQueryBuilder("c");
     
    	$result = $qb
    			->where("s.date < :maxDate")
    			->addWhere("s.date >= :minDate")
    			->setParameter(":maxDate", new \DateTime('+' . $duree . 'day');)
    			->setParameter(":minDate",new \DateTime())
    			->getQuery()
    			->execute()
    	;
     
    	return $result;
    }

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2013
    Messages : 71
    Points : 84
    Points
    84
    Par défaut
    Merci pour vos retours.

    En rajoutant un dump et unset de $ladate, j'obtiens le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Datetime: 2015-1-19
     
    Datetime: 2015-1-20
     
    Datetime: 2015-1-21
     
    ...
    Pour le code présenté ci-dessus, je l'ai volontairement rédigé très verbeux pour vous le présenter "complet" et faire apparaître les quelques tests que j'ai pu faire.

    Le setDateCommande, je le met car le loadOneCommande retourne une entité CommandeMidi correctement hydratée si elle existe ou retourne une entité CommandeMidi vide si elle n'existe pas. Il faut donc que je renseigne manuellement la date de commande de façon à pouvoir utiliser un peu plus loin un voter pour faire apparaître la commande ou pas selon la date.

    En réalité, le Manager de commandes est appelé plus en amont et utilisé encore plus en aval. J'aurai pu le sortir de la boucle en effet, le unset pour montrer que j'ai la volonté de vider l'entité et le array_push car il permet de n'avoir aucune ambiguïté sur ma volonté de renseigner un nouveau tableau. Je n'utilise pas directement les repositories, je ne m'en sers que dans les managers. Toute information doit transiter par un manager pour s'assurer (entre autre) que l'information est valide (notamment is_enable=true), c'est juste une convention de nommage entre nous.

    L'application n'est pas encore en production du coup, je n'ai que mes commandes de tests renseignées, autant dire quasiment aucune. Ce que je ne comprends c'est que, je pensai qu'il se passerait ceci :
    - je cherche une commande, y'a pas, je retourne l'entité vide
    - je renseigne la date
    - je rajoute l'entité à la fin du tableau
    - je reviens au début
    - je cherche une commande, y'a pas, je retourne l'entité vide
    - je renseigne la date
    - je rajoute l'entité à la fin du tableau

    Sauf que là, PAF !!!! il change la date de l'ensemble des entités contenues dans le tableau oO

    D'ailleurs, ce n'est pas le fait de mettre l'entité dans le tableau qui pose problème mais c'est le $commandemidi->setDateCommande($ladate) qui change la date de toutes mes entités du tableau. J'ai pu révéler ce problème en bougeant le dump. Il n'y aurait pas une histoire de lazy loading là-dessous par hasard ?

    Info importante que j'ai oubliée -_- C'est la version 2.7.6 de Symfony

Discussions similaires

  1. Une histoire de compte à rebours (avec formulaire)
    Par Olivier14 dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 04/03/2009, 13h43
  2. encore une histoire de transparence
    Par mathou810 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 28/09/2006, 13h45
  3. Une histoire de popup
    Par zoidy dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 02/06/2006, 14h39
  4. Une histoire de lien...
    Par sloshy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 25/08/2005, 23h13
  5. [JAR][debutant] encore une histoire de classpath
    Par blaz dans le forum Général Java
    Réponses: 6
    Dernier message: 27/07/2005, 12h28

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