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 :

Cascade OneToMany Symfony


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    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
    Par défaut Cascade OneToMany Symfony
    Bonjour,
    j'ai deux entités User et Sujet , un user peut ajouter plusieurs sujets . Dans la vue ,lorsque j'affiche le sujet j'affiche egalement le user qui l'a ajouté (username+imageuser ..)

    Lorsque je veux supprimer un user , je veux garder ses sujets quand meme et lors de l'affichage des sujets , ces derniers auront comme username " anonyme"

    Pour ce faire j 'ai implementé :
    Sujet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class sujet {
     
     ///// code ici
     
        /**
         * @ORM\ManyToOne(targetEntity="MyApp\UserBundle\Entity\User", cascade={"all"})
         * @ORM\JoinColumn(name="user_id", referencedColumnName="id",nullable=false, onDelete="CASCADE")
         */
        protected $user;
    User :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class sujet {
     
     ///// code ici
    protected $sujets;
    // get et set
    }


    User Controller :
    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
     
        public function deleteAction(user $user) {
            $em = $this->getDoctrine()->getManager();
             $selectuser = $em->getRepository('MyAppForumBundle:sujet')->findBySujet($user->getId());
          /**   je selectionne les sujets associé au user deja choisi  **/
          $ids = $user->getId();   
           $sujet = $em->getRepository('MyAppForumBundle:sujet')->getSujetByUser($ids);
           foreach ($sujet as $s) /** update pour plusieurs sujets **/
          /***   les sujets reuperé auont un nouveau id_user = 1  ***/           
           { $p = $em->createQueryBuilder()
                                ->update('MyAppForumBundle:sujet', 'd')
                                ->set('d.user', '1')
                                ->where('d.user = :v')
                                ->setParameter('v', $s)
                                ->getQuery()
           ->execute(); }
          /***** je supprime le user choisi au debut  ***/
          $em->remove($user);
          $em->flush();
            $this->get('session')->getFlashBag()->set('message', 'Ce user disparait !!');
            return $this->redirect($this->generateUrl('my_app_user_show', array(
                                'selectuser' => $selectuser
            )));
     
     
        }
    SujetRepository:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public function getSujetByUser($id) {
            return $this->getEntityManager()
                            ->createQuery('  SELECT t   FROM MyAppForumBundle:sujet t   WHERE t.user=:id ')
                            ->setParameter('id', $id)
                            ->getResult();
        }
    j'ai ensuite creé avec les fixtures :
    un user avec username "anonyme" .


    Ma logique marche .
    La Question : es-ce que je peux faire mieux ?
    Merci a tous .

  2. #2
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Oui, y a pas mal de chose que tu peux mieux faire.

    - Commence par répartir les différentes parties de ton code dans les bons fichiers : le traitement métier va dans des manager à part, les requêtes vont dans les repositories.
    - Tu ne devrais pas faire de requête dans une boucle, surtout quand tu peux flusher toute une collection sans avoir à boucler dessus. Là tu assassines ta BDD de requêtes.
    - Créer une entité User anonyme n'est pas une bonne idée. Ta table User ne doit contenir que des vrais users, un user anonyme est quelque chose qui ne rentre pas dans cette table : c'est un élément du métier, pas du modèle.

    Jète un oeil aussi aux bonnes pratiques, ça ne peut pas faire de mal.
    http://symfony.com/doc/current/best_...ces/index.html
    ++

Discussions similaires

  1. [2.x] Supprimer en cascade avec Symfony 2.1.2
    Par lionceau dans le forum Symfony
    Réponses: 6
    Dernier message: 27/05/2013, 19h01
  2. Question @OneToMany Cascade.ALL
    Par oliv37 dans le forum Hibernate
    Réponses: 1
    Dernier message: 14/04/2013, 21h42
  3. Réponses: 2
    Dernier message: 27/08/2009, 03h31
  4. Réponses: 2
    Dernier message: 29/04/2009, 18h58
  5. Suppression en cascade OneToMany
    Par piotrr dans le forum Hibernate
    Réponses: 1
    Dernier message: 20/05/2008, 16h14

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