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 Column objet à sauver comme un entier


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 46
    Points : 39
    Points
    39
    Par défaut Doctrine Column objet à sauver comme un entier
    Bonjour,

    J'ai une entité, cette entité à divers attributs et plusieurs d'entre-eux sont des objets que je souhaiterai persister en base de données.

    Sauf que c'est très lourd de les sauver soit en tant qu'entité soit de type objet (sérialise) alors que ses objets n'ont finalement comme unique caractéristique un nombre.

    Donc plutôt que de sauvé l'objet complet dans la base de données il serait plus judicieux de ne sauver que cet entier au moment du flush et évidement reconvertir cet entier présent dans la base de données en objet au moment de la récupération de l'objet.

    Sauf que je ne sais pas comment faire pour expliquer à doctrine comment il doit faire les conversions... j'imagine qu'il doit exister une/des méthode(s) à implémenter... mais je n'ai pas trouver.

    Pouvez-vous m'aider ?

    Merci d'avance pour votre aide.
    Cordialement, orion99.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 46
    Points : 39
    Points
    39
    Par défaut
    Après des recherches plus poussée j'ai trouvé un début de solution.

    Il existe un concept doctrine appelé "Callbacks et cycle de vie" et je pense que c'est ce concept qui est censé m'aider à résoudre mon problème.

    Avec l'annotation PostLoad j'arrive à traduire l'entier issus de ma base de données en objet et sa c'est déjà très bien. En revanche je n'arrive pas à traduire mon objet en entier avant l'insertion.

    J'ai tenté avec l'annotation PreUpdate, PreFlush et PrePersist et aucuns ne semble être exécuté... évidement j'ai droit à une exception me disant que je tente d'enregistrer un objet à la place d'un entier.

    En théorie, une solution serai d'implémenter la méthode __toString dans ma classe pour régler le problème, j'ai d'ailleurs essayé et sa marche mais je trouve sa vraiment très laid, j'ai l'impression que je me foire quelque par avec l'enregistrement de mon entité mais je ne vois pas où. J'ai testé de mettre un echo dans la méthode et je ne vois jamais rien apparaître à l'écran.

    Quelqu'un aurait-il une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
     * @ORM\Entity
     * @ORM\HasLifecycleCallbacks
     */
    class MaClass {
        /**
         * @ORM\PreFlush
         */
        public function preFlush() {
            // code de transformation
        }
    }

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    PrePersist n'est appelé qu'une seule fois, au moment du premier enregistrement. Montre ta méthode preUpdate?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4
    Points : 10
    Points
    10
    Par défaut
    Pourquoi ne pas utiliser un DataTransformer ?

    http://symfony.com/fr/doc/current/co...nsformers.html

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 46
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    Effectivement, lorsque j'ai vu prePersist je me suis dit que sa n'était pas sa, mais vu que preUpdate et preFlush ne donnait rien j'ai quand même tenté au cas où ^^

    La méthode est toujours la même, c'est juste l'annotation que j'ai changé dans mes test... le code à l'intérieur n'aidera pas ^^ je transforme un de mes attribut qui est un objet en entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	/*
    	 * @ORM\PreUpdate
    	 */
    	public function preFlush() {
    		$this->lanceurMissile = $this->lanceurMissile->getQuantite();
    	}
    La méthode postLoad faisant évidement exactement l'inverse (et sa, sa marche). Donc pour raison qui m'échape postLoad est appelé alors que preUpdate et preFlush ne le sont pas.

    Alors j'ai regardé les DataTransformer avec attention...et oui dans l'absolu c'est ce que je souhaite faire... sauf que sa s'applique au formulaire... sa n'aurai rien de gênant pour peu que je puisse définir quelque par qu'il faut initié la transformation avant sauvegarde et après récupération de mon objet.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Il faut peut-être que tu notifies le changement à Doctrine, puisqu'au moment où tu fais la transformation, Doctrine croit qu'il a encore affaire à un objet.

    Je pense que tu peux le faire avec postUpdate(LifecycleEventArgs $event), comme indiqué ici: http://docs.doctrine-project.org/en/...event-argument et là http://www.theodo.fr/blog/2013/11/ne...-doctrine-2-4/

    Tu fais alors ta transformation, et tu complètes par ceci pour indiquer le changement à doctrine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $entity = $event->getEntity();
    $em = $event->getEntityManager();
    $cm = $em->getClassMetadata(get_class($entity));
    $em->getUnitOfWork()->recomputeSingleEntityChangeSet($cm, $entity);
    Sans garantie! Et si cela ne marche pas, il faudra sans doute créer une classe de listener pour ton entity.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/01/2010, 15h17
  2. [2.3.2] Objet Java comme donnée d'en-tête
    Par Fichman dans le forum BIRT
    Réponses: 9
    Dernier message: 14/09/2009, 18h04
  3. Listbox contenant des objets, afficher comme texte un attribut de l'objet.
    Par Jean_guy dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 16/12/2008, 03h30
  4. Manipuler des TDateTime comme des entiers?
    Par toufou25 dans le forum C++Builder
    Réponses: 8
    Dernier message: 22/06/2006, 15h52
  5. Réponses: 5
    Dernier message: 15/11/2005, 12h57

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