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 :

methode remove dans une collection [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut methode remove dans une collection
    Bonjour, je m'explique:

    J'ai une entité Cart:

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    <?php
     
    /* 
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    namespace Frontend\PanierBundle\Entity;
    use Doctrine\ORM\Mapping as ORM;
     
     
    /**
    *    @ORM\entity
    *    @ORM\Table(name="cart")
    */
    class Cart {
     
     
    /** @ORM\Id
    *  @ORM\Column(type="integer")
    *  @ORM\GeneratedValue
    */
    private $id;
     
     
    /**
    * @ORM\OneToMany(targetEntity="CartProduct", mappedBy="cart",cascade={"persist", "remove"})
    */
     
    private $cart_product;
     
    /** @ORM\Column(name="created_at", type="string", length=255) */
    private $createdAt;
        /**
         * Constructor
         */
        public function __construct()
        {
            $this->cart_product = new \Doctrine\Common\Collections\ArrayCollection();
        }
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Add cart_product
         *
         * @param \Frontend\PanierBundle\Entity\CartProduct $cartProduct
         * @return Cart
         */
        public function addCartProduct(\Frontend\PanierBundle\Entity\CartProduct $cartProduct)
        {
            $this->cart_product[] = $cartProduct;
     
            return $this;
        }
     
        /**
         * Remove cart_product
         *
         * @param \Frontend\PanierBundle\Entity\CartProduct $cartProduct
         */
        public function removeCartProduct(\Frontend\PanierBundle\Entity\CartProduct $cartProduct)
        {
            $this->cart_product->removeElement($cartProduct);
        }
     
        /**
         * Get cart_product
         *
         * @return \Doctrine\Common\Collections\Collection 
         */
        public function getCartProduct()
        {
            return $this->cart_product;
        }
     
        /**
         * Set createdAt
         *
         * @param string $createdAt
         * @return Cart
         */
        public function setCreatedAt($createdAt)
        {
            $this->createdAt = $createdAt;
     
            return $this;
        }
     
        /**
         * Get createdAt
         *
         * @return string 
         */
        public function getCreatedAt()
        {
            return $this->createdAt;
        }
     
        public function __sleep()
        {
            return array('id','createdAt','cart_product');
        }
        public function __wakeup() {
        }
       public function __toString() {
            return  (string)$this->id;
        }
    }
    puis une entite Cart_product les unis par une collection de Cart_product par l'entite Cart "OneToMany"

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    <?php
     
    /* 
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    namespace Frontend\PanierBundle\Entity;
    use Doctrine\ORM\Mapping as ORM;
     
    /**
    *    @ORM\Entity(repositoryClass="Frontend\PanierBundle\Entity\CartProductRepository")
    *    @ORM\Table(name="cart_product")
    */
    class CartProduct {
        //put your code here
     
         /**
         *    @ORM\GeneratedValue
         *    @ORM\Id
         *   @ORM\Column(type="integer")
         */
        private $id;
     
     
        /**
        * @ORM\ManyToOne(targetEntity="Cart",inversedBy="id")
         * 
         */
         private $cart;
     
         /**
    
         * @ORM\ManyToOne(targetEntity="\Frontend\CatalogueBundle\Entity\Produit",inversedBy="id")
         * 
         */
        private $leProduit;
     
     
        /** @ORM\Column(type="integer")
        *
        */
        private $quantite;
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set cart
         *
         * @param \Frontend\PanierBundle\Entity\Cart $cart
         * @return CartProduct
         */
        public function setCart(\Frontend\PanierBundle\Entity\Cart $cart = null)
        {
            $this->cart = $cart;
     
            return $this;
        }
     
        /**
         * Get cart
         *
         * @return \Frontend\PanierBundle\Entity\Cart 
         */
        public function getCart()
        {
            return $this->cart;
        }
     
        /**
         * Set leProduit
         *
         * @param \Frontend\CatalogueBundle\Entity\Produit $leProduit
         * @return CartProduct
         */
        public function setLeProduit(\Frontend\CatalogueBundle\Entity\Produit $leProduit = null)
        {
            $this->leProduit = $leProduit;
     
            return $this;
        }
     
        /**
         * Get leProduit
         *
         * @return \Frontend\CatalogueBundle\Entity\Produit 
         */
        public function getLeProduit()
        {
            return $this->leProduit;
        }
     
        /**
         * Set quantite
         *
         * @param integer $quantite
         * @return CartProduct
         */
        public function setQuantite($quantite)
        {
            $this->quantite = $quantite;
     
            return $this;
        }
     
        /**
         * Get quantite
         *
         * @return integer 
         */
        public function getQuantite()
        {
            return $this->quantite;
        }
       public function __sleep()
        {
            return array('id','cart','quantite');
        }
        public function __wakeup() {
        }
     
    }
    Pour commence je fais l'exemple d'ajouter une nouvelle instance de Cart ainsi qu'une nouvelle instance de Cart_product en persistant l'instance de Cart_product par l'instance de classe Cart
    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
    $cart_product = CartProduct()
    $cart_product->setQuantite(1);
     
    $cart = new Cart()
    $cart->setCreatedAt(date("F j, Y, g:i a"));
    $cart_product->setCart($cart);
     
    $cart->addCartProduct($cart_product);//insertion d'une nouvelle ligne dans la collection cartproduct
    /*public function addCartProduct(\Frontend\PanierBundle\Entity\CartProduct $cartProduct)
        {
            $this->cart_product[] = $cartProduct;
        
            return $this;
        }*/
    $this->em->persist($cart);
    $this->em->flush();
    Pour les action ci-dessus tout fonctionne a merveille j'ai bien mon enregistrement en base pour le Cart ainsi que l'enregistrement Cart_product correspondant au Cart

    Mais maintenant je voudrais supprimer l'enregistrement Cart_product précédemment créé en réalisant les action ci'-dessous
    //je récupére mon objet Cart
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     $cart = $this->em->getRepository('MonBundle:Cart')->find(2);
     
    //je récupére mon objet Cart_product
     $cart_product = $this->em->getRepository('MonBundle:Cart')->find(3);
     
     
    $cart->removeCartProduct($cart_product);   
    $cart->setCreatedAt(date("F j, Y, g:i a"));
    $this->em->persist($cart);
    $this->em->flush();
     
    //en faisant un affichage de la collection de cart_product, je vois bien que le cart-product a été supprimé
    var_dump( $cart->getCartProduct()->getValues());
    mais hélas pas en base de donné donc je comprend pas pourquoi la methode $cart->removeCartProduct($cart_product); ne supprimé pas en base?

    J'ai cela dit essayé avec la methode $this->em->remove($cart_product); et la ca focntionne mais la methode
    $cart->removeCartProduct($cart_product) sert bien à supprimer un objet cart-product d'une collection par l'objet Cart

    Une idée les amis

    Merci à 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
    Hello,

    Si tu souhaites que le changement de l'objet Cart influe sur un ou plusieurs objet de sa collection, il faut que le OwningSide de la relation soit sur l'entité Cart et non sur Cart_product.

    Le owning side étant celui qui possède l'annotation inversedBy. Dans ton cas il se trouve du coté du produit, ce qui n'est pas logique : persister un produit ne doit pas persister le caddie. C'est lorsque tu persistes le caddie que les changements doivent se répercuter sur les produits.

    http://doctrine-orm.readthedocs.org/...ociations.html

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 133
    Par défaut
    Salut Nico_F,

    Je suis sûr et certain à 50% que c'est la table qui a la clé étrangère qui est le owning side, donc CartProduct en l’occurrence.

    Alex

  4. #4
    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
    Au temps pour moi, tu as raison j'ai lu un peu trop rapidement la doc (ainsi que son problème).
    J'avais zappé cette partie.

    ManyToOne is always the owning side of a bidirectional association.
    OneToMany is always the inverse side of a bidirectional association.
    C'est une relation bidirectionnelle, donc soit tu bascules sur une relation unidirectionnelle, soit tu modifies les méthodes addProduct et removeProduct (je sens le problème viens de là : peux-tu nous les montrer ?) en ajoutant un $product->setCart($this); pour le add ou un $product->setCart(null); pour le remove.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Salut Nico_F, oui en effet j'ai rien compris au message précédent.

    Donc tu veu voir les methodes:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    <?php
     
    /* 
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    namespace Frontend\PanierBundle\Entity;
    use Doctrine\ORM\Mapping as ORM;
     
     
    /**
    *    @ORM\entity
    *    @ORM\Table(name="cart")
    */
    class Cart {
     
     
    /**
    * @ORM\OneToMany(targetEntity="CartProduct", mappedBy="cart",cascade={"persist", "remove"})
    */
     
    private $cart_product;
     
        /**
         * Constructor
         */
        public function __construct()
        {
            $this->cart_product = new \Doctrine\Common\Collections\ArrayCollection();
        }
     
     
        /**
         * Add cart_product
         *
         * @param \Frontend\PanierBundle\Entity\CartProduct $cartProduct
         * @return Cart
         */
        public function addCartProduct(\Frontend\PanierBundle\Entity\CartProduct $cartProduct)
        {
            $this->cart_product[] = $cartProduct;
     
            return $this;
        }
     
        /**
         * Remove cart_product
         *
         * @param \Frontend\PanierBundle\Entity\CartProduct $cartProduct
         */
        public function removeCartProduct(\Frontend\PanierBundle\Entity\CartProduct $cartProduct)
        {
            $this->cart_product->removeElement($cartProduct);
        }
     
     
    }
    De plus omme je disais dans les message précédent le fait de vouloir ajouter un objet dans la collection "cart_product" en persistant un l'objet "cart" et que l'ajout soit pris en compte en mémoire et en base fonctionne parfaitement:

    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
     
    $cart = $this->em->getRepository('FrontendPanierBundle:Cart')->find(1);
    $cart_product = $this->em->getRepository('FrontendPanierBundle:CartProduct')->find(2);
     
    $cart_product = CartProduct()
    $cart_product->setQuantite(1);
     
    $cart = new Cart()
    $cart->setCreatedAt(date("F j, Y, g:i a"));
    $cart_product->setCart($cart);
     
    $cart->addCartProduct($cart_product);//insertion d'une nouvelle ligne dans la collection cartproduct
    /*public function addCartProduct(\Frontend\PanierBundle\Entity\CartProduct $cartProduct)
        {
            $this->cart_product[] = $cartProduct;
     
            return $this;
        }*/
    $this->em->persist($cart);
    $this->em->flush();
    C'est dans le cas de la suppression l'objet et bien supprimer en mémoire mais pas en base de donnée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     $cart = $this->em->getRepository('FrontendPanierBundle:Cart')->find(1);
     $cart_product = $this->em->getRepository('FrontendPanierBundle:CartProduct')->find(2);
     
     var_dump( $cart->getCartProduct()->getValues());exit;//ce var_dump affiche la collection avec un seul objet "$cart_product" dans la collection "cart_product"         
     
            //$cart->removeCartProduct($cart_product);   //je supprime
            $cart_product->setQuantite(10);
            $cart->setCreatedAt(date("F j, Y, g:i a"));
            $this->em->persist($cart);
            $this->em->flush();
     
     var_dump( $cart->getCartProduct()->getValues());exit;
    ce var_dump affiche la collection vide, l'objet "$cart_product" de la collection "cart_product" a bien été supprimer, mais élas rien n'est supprimer en base de donnée

  6. #6
    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
    De plus omme je disais dans les message précédent le fait de vouloir ajouter un objet dans la collection "cart_product" en persistant un l'objet "cart" et que l'ajout soit pris en compte en mémoire et en base fonctionne parfaitement:
    Oui, ça fonctionne car dans ton controller tu fais l'affectation dans les deux sens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $cart_product->setCart($cart);
    $cart->addCartProduct($cart_product);
    En réalité, la première ligne devrait se trouver dans la méthode addCartProduct().

    Modifie ces deux méthodes comme ça :

    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
    public function addCartProduct(\Frontend\PanierBundle\Entity\CartProduct $cartProduct)
    {
        $cartProduct->setCart($this);
        $this->cart_product[] = $cartProduct;
     
        return $this;
    }
     
    public function removeCartProduct(\Frontend\PanierBundle\Entity\CartProduct $cartProduct)
    {
        $cartProduct->setCart(NULL);
        $this->cart_product->removeElement($cartProduct);
     
        return $this;
    }
    De cette manière tu n'auras plus besoin de setter le cart dans ton controller.

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

Discussions similaires

  1. [VB.NET] Suppression d'objets dans une collection
    Par master56 dans le forum VB.NET
    Réponses: 7
    Dernier message: 03/06/2010, 21h46
  2. [9i] insertion dans une collection
    Par meuledor dans le forum Oracle
    Réponses: 2
    Dernier message: 17/02/2006, 12h02
  3. Réponses: 8
    Dernier message: 03/02/2006, 15h15
  4. [PL/SQL] Charger une table dans une collection
    Par nosnoss dans le forum Oracle
    Réponses: 10
    Dernier message: 03/03/2005, 17h56
  5. Controle dans une collection
    Par rolototo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 07/02/2005, 14h12

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