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 :

Persister une entité créée manuellement [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut Persister une entité créée manuellement
    Salut

    Je cherche à faire comprendre à Doctrine que je veux persister une entité que j'ai créé de toute pièce (via new MyEntity() et divers setXX()).

    Cette entité a une clef primaire, définie via un yml, qui est reconnue pas de soucis.

    Par contre quand dans l'entité que je créé moi j'affecte un id existant en base, et que je fais un persists derrière, doctrine ne comprend pas que cette entité existe et qu'il faut faire un update au lieu d'un insert.

    J'ai bien trouvé la méthode merge au lieu de persist, mais merge va faire une requête en base pour modifier mon objet avec les données de la base, hors moi je cherche une façon de faire sans aucune requête (d'où ma création manuelle).

    Quelqu'un a une iée ?

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 81
    Points : 56
    Points
    56
    Par défaut
    Salut!

    Je ne comprends absolument pas ce que tu cherches a faire ?

    Tu dis vouloir mettre a jour une entite de la base? Pourquoi tu ne la recupere pas via doctrine avant de la modifier puis de la flush ?

    Autrement tu dis ne pas vouloir faire de requete ? Alors dans ce cas la pourquoi as tu besoin d'utiliser doctrine ? Doctrine sert justement a faire des requetes a ta place !

    Tu devrais plus preciser ta demande avec des exemples de code, ca serait plus facile pour t'aider...

  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
    J'ai compris, mais je vois pas trop l’intérêt.
    Tu peux essayer $entityManager->getReference('XXXYBundle:Mytable',$id) qui te retourne l'élément sans faire de requete en base de données (utile pour set des clefs étrangères).

    Par contre créer un objet de a a Z puis le persister en tant qu'un objet déjà existant en base c'est dangereux tu risques de perdre des infos de ton objet.
    Soit tu récupère l'objet en bdd, (en plus c'est pas une requête couteuse) et la tu utilises les setMachin();

    Soit tu fais directement une requete update en doctrine, c'est simple et c'est le plus propre pour faire ce que tu demandes

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    C'est un peu compliqué à expliquer, mais en gros je fais un système de cache sur des entités qui ne changent que très peu mais que j'utilise beaucoup.

    C'est en relisant le cache (c'est un bête var_export de mon entité) que j'ai le soucis, parceque j'ai toute mon entité en cache mais pour la donner à doctrine, il refait une requête et donc mon cache ne sert à rien

    Je viens de tester getReference, et j'ai le même comportement que merge, une requête est effectuée par appel à getReference.

    L'idée de faire un update doctrine est intéressante, mais dans mon cas cette entité est liée à une autre, et pour que l'autre soit gérée par doctrine il faut que cette entité en cache le soit aussi.

  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
    C'est encore plus dangereux de laisser la variable en cache et de chercher a la modifier telle quelle.(modifications des données en base entre temps etc..)

    Une requête pour aller chercher une entité c'est pas grave tant que ca augmente pas ton nombre de requête de manière exponentielle.

    Si tu met une variable en cache, déjà il faut casser le lien avec doctrine par sécurité (utilise $em->detach() ).
    Ensuite tu peux utiliser toutes tes méthodes get de ton objet, le lier en le récupérant par référence son id

    Par exemple
    j'ai un objet de Class User en cache ou en session:
    Je récupère ses infos pour la page d'accueil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $user_cache->getNom() //(ca ne devrait pas faire de requête)
    j'ai besoin de chercher les articles de cet user
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $user =$entityManager->getReference('XXXYBundle:User', $user_cache->getId()); //ne génère pas de requete
    $articles = $entityManager->getRepository('XXXYBundle:Article')->findByUser($user); //génère une requete (normal)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    Je sais que c'est dangeureux, mais je dois absolument mettre un cache sur les entités.

    Dans ma page, si je ne met pas dans de cache, j'ai dans les 500 requêtes, et crois moi qu'au niveau conception je ne peux pas faire mieux.

    Je confirme que faire un appel à getReference me fait bien une requête. Je vais aller lire la doc la dessus, voir si il y a quelques chose à faire.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 60
    Points
    60
    Par défaut
    Du coup j'ai trouvé de la doc qui dit que l'appel à getReference va bien effectuer une requête, si jamais l'entité demandée n'a jamais été utilisée. Va être stocké cette entité dans unitOfWork sur le manager, et le prochain appel à getReference retournera cette version stockée sans faire de requête.
    Ce fonctionnement ne me convient pas dans le sens ou justement j'essaye de faire un cache pour ne plus du tout executer de requête.

    Donc en fouillant le code, j'ai trouvé ! Il faut faire $doctrine->getManager()->getUnitOfWork()->createEntity('\NameSpace\Class', array('id' => 18, 'property' => 'ahaha');
    Ceci permet de créer une entité avec les infos qu'on lui donne, en mettant cette référence dans le unitOfWork, le persist est fait, doctrine comprend bien que c'est une entité qui existe et fait donc un update au lieu d'un insert, etc. Bref, tout va pour le mieux

    Merci à ceux qui ont essayé de m'aider, en espérant que ça pourra en aider d'autres

  8. #8
    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
    Désolé de la fausse piste alors, merci de la solution

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

Discussions similaires

  1. Persister une entité et flush "plus tard"
    Par solofein dans le forum Doctrine2
    Réponses: 5
    Dernier message: 30/09/2014, 01h45
  2. [2.x] PB pour persister une entité
    Par philodido dans le forum Symfony
    Réponses: 3
    Dernier message: 30/10/2013, 16h58
  3. [2.x] Impossible de Persister une entité
    Par hx.jonathan dans le forum Symfony
    Réponses: 10
    Dernier message: 03/10/2011, 18h37
  4. Réponses: 12
    Dernier message: 27/05/2010, 20h01
  5. Réponses: 0
    Dernier message: 19/03/2010, 08h55

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