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 :

Comprendre le Lazy Load


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 38
    Points : 14
    Points
    14
    Par défaut Comprendre le Lazy Load
    Bonjour à tous,

    Je veux bien un coup de main pour comprendre ce comportement

    Soit une entité A qui possède, dans ses attributs une entité B.
    B possède dans ses attributs une collection d’entités C

    Note: J'ai simplifié le code pour aller à l'essentiel de la situation

    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
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    class A
    {
     
    …………………….
     
        /**
         * @var \B
         *
         * @ORM\GeneratedValue(strategy="NONE")
         * @ORM\ManyToOne(targetEntity="Company")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="id_b", referencedColumnName="id_b" , onDelete="CASCADE")
         * })
         */
        private $b;
     
        /**
         * Get idB
         *
         * @return \......\Entity\B 
         */
        public function getB()
        {
            return $this->b;
        }
    }
    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
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    class B
    {
    ……………………………………….
        /**
         * @ORM\OneToMany(targetEntity="HourTypePriority", mappedBy="idCp")
         */
        private $c;
     
        /**
         * Get C
         *
         * @return \Doctrine\Common\Collections\Collection 
         */
        public function getC()
        {
            return $this->c;
        }
     
    }
    Probleme :

    Voici ce qu’il se passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    em         = $this->container->get('doctrine')->getManager();
    $rep      = $em->getRepository('A');
    $a          = $rep->find($id);
     
    echo "NB C: " . $a->getB()->getC()->count() . "<br>";
    Retourne 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $repB    = $em->getRepository('B');
    $b          = $repB->find(38);  //Même id que dans le $a->getB() ci-dessus bien évidement
    echo "Nb C: " . $b->getC()->count() . "<br />";
    Retourne le bon nombre

    Il semble que le lazy load ne fonctionne que pour le premier niveau.
    Avez-vous une idée ??

    Merci d'avance pour le coup de main

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $a->getB()->getC()->getId();
    Tu as bien la valeur 38 ?
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 38
    Points : 14
    Points
    14
    Par défaut
    Hello,

    38, c'est l'id de b, pas de c
    Et oui:
    me donne bien 38

    Quant à b->getC() c'est une collection d'entités d'où le count

  4. #4
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Oui, en effet.

    Dans ta classe B, tu as bien mis dans le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function __construct()
    {
        $this->c = new ArrayCollection();
    }
    ?
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 38
    Points : 14
    Points
    14
    Par défaut
    Oui oui, il est bien présent

    Ce qui me perturbe, c'est que lorsque j'instancie directement B, ça fonctionne
    C'est comme si le lazy load ne fonctionnait que pour un seul niveau et non pas pour deux niveaux....

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 38
    Points : 14
    Points
    14
    Par défaut
    Je viens de trouver

    Voici mon erreur...

    Pour passer d'un form à l'autre, je mettais une entité en session car je ne veux la persister qu'après le second form.
    Du coup, je me retrouvais avec une entité "dirty" comme m'a dit Symfony

    A la place, au lieu de faire un new lors du premier form, je passe les données saisies directement au second form et c'est lui qui fait le new sans passer par la session.

    Et là, sans traverser la sérialisation, tout fonctionne parfaitement

    Merci pour ton aide

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

Discussions similaires

  1. spring2 hibernate3 : lazy loading
    Par fxonline dans le forum Hibernate
    Réponses: 9
    Dernier message: 10/02/2007, 18h56
  2. Lazy loading sur component
    Par El Saigneur dans le forum Hibernate
    Réponses: 2
    Dernier message: 03/11/2006, 10h30
  3. Lazy loading et fermeture de session hibernate
    Par BRAUKRIS dans le forum Hibernate
    Réponses: 3
    Dernier message: 20/07/2006, 13h08
  4. [hibernate] problème pour desactiver le lazy loading
    Par agougeon dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/03/2006, 11h20
  5. [HIBERNATE 3]Lazy loading
    Par SEMPERE Benjamin dans le forum Hibernate
    Réponses: 11
    Dernier message: 08/02/2006, 22h40

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