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

Doctrine2 PHP Discussion :

flush que d'un seul entity


Sujet :

Doctrine2 PHP

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut flush que d'un seul entity
    Bonjour,

    Dans mon appli, je persist plusieurs objets mais je ne veux pas tous les "flusher" en base de données en même temps, car certain objet sont encore en construction.
    Donc je fais des persist() tout au long de mon controlleur et quand j'ai besoin d'envoyer en BD un objet particulier, je fais un $this->doctrine->getManager()->fluch($monObjet) pour n'envoyer que $monObjet et à la fin de ma procédure, je fais un flush() sans paramètre pour tout envoyer en base.
    Le soucis est qu'il me "flush" tous les objets qui étaient persistés jusque là ! il ne tiens pas compte de mon objet passé en paramètre....
    Comme faire ?
    Merci de votre aide.
    Jérôme

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Points : 1 022
    Points
    1 022
    Par défaut
    a mon avis tu peux créer un service et la tu décris par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public function doFlush($article) {
            $this->em->persist($article);
            $this->em->flush();
            return $article;
        }
    et un persist blanc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public function noFlush($article) {
            $this->em->persist($article);
     //////       $this->em->flush();
            return $article;
        }
    et dans ton contrôleur tu applique la bonne méthode sur ton objet concerné

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Pourquoi persister des objet que tu ne veux pas flusher?
    tu n'as qu'a faire le persist que lorsque tu veux sauvegarder l'objet

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut
    En fait je vais vous expliquer pourquoi je fais ça...
    J'importe dans mon application un fichier excel qui contient des users.
    Mon programme lit ligne par ligne le fichier excel et pour chaque ligne crée un nouvel User et un nouveau Profil et un/des nouveau/x Batiment, etc...
    Il existe des relations entre les objets créés et aussi avec des objets déjà existants dans la base de données comme par exemple la ville.
    Chaque batiment est dans une ville donnée et donc lorsque je crée un nouveau Batiment, je fais appel à un service qui me renvoie un objet Ville pour l'affecter à mon Batiment.
    Cet objet est récupéré dans la base de donnée s'il existe, sinon il est créé par le service qui me renvoie toujours un objet Ville existant.
    Donc dans ce service, si ma ville n'existe pas je la crée et fais un flush($ville) pour la mettre dans la base de donnée sans attendre la fin de mon process, comme ça lorsqu'il passe au batiment suivant, si celui-ci est dans la même ville que le précédent, mon service va me renvoyer la ville qui va bien et non pas recréer un objet Ville car il ne l'aura pas trouvé dans la BD...
    Voici donc pourquoi j'ai besoin de "flusher" uniquement ma ville et pas mes autres objets car ils sont en cours de construction et donc potentiellement incomplet

    Du coup suite à vos réponses, j'ai modifié mon code afin de décaler mes persist à la fin :
    Pour chaque ligne de mon excel
    -- je crée mes objets
    -- je set mes valeurs
    -- je validate
    -- si erreur de validation
    ---- je renvoie mon erreur
    -- sinon
    ---- je persist mes objets
    ---- je flush

    Mais il me pose un problème car il ne persiste pas un de mes objets qui a été créé et donc j'ai une Integrity constraint violation car un autre objet créé en a besoin.
    Je creuse, mais si vous avez une idée, je prends...
    Merci.
    Jérôme

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Je comprend mieux
    Doctrine est à éviter pour les traitement de masse. (ils le disent eux même dans leur doc)


    Chaque batiment est dans une ville donnée et donc lorsque je crée un nouveau Batiment, je fais appel à un service qui me renvoie un objet Ville pour l'affecter à mon Batiment.
    Cet objet est récupéré dans la base de donnée s'il existe, sinon il est créé par le service qui me renvoie toujours un objet Ville existant.
    Donc dans ce service, si ma ville n'existe pas je la crée et fais un flush($ville) pour la mettre dans la base de donnée sans attendre la fin de mon process, comme ça lorsqu'il passe au batiment suivant, si celui-ci est dans la même ville que le précédent, mon service va me renvoyer la ville qui va bien et non pas recréer un objet Ville car il ne l'aura pas trouvé dans la BD...
    Je conseille de changer ce process de cette manière:
    (je suppose que les villes sont identifié par un code ou un champ unique pour que tu trouves la ville correspondante dans ta bdd)
    Je récupère toutes mes villes de la base de données dans un tableau indexé par CodeVille
    Si elle n'existe pas dans ce tableau, la ville créé lors de l'import est persisté, et ajouté a son tour dans le tableau.

    Puis j'affecte un batiment a une ville en la récupérant dans le tableau indexé (contenant les nouvelles villes et les anciennes)
    je flush le tout

    Autre piste: tu créés tes objets en flushant tout le temps, mais tu met ca dans une transaction

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/12/2008, 12h53
  2. Réponses: 4
    Dernier message: 16/10/2008, 17h36
  3. Réponses: 1
    Dernier message: 16/10/2008, 15h17
  4. Réponses: 1
    Dernier message: 19/06/2008, 21h14
  5. impression que d'un seul formulaire
    Par ildan dans le forum IHM
    Réponses: 1
    Dernier message: 15/06/2007, 23h04

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