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 et l'héritage // Gestion d'un panier [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 97
    Points : 40
    Points
    40
    Par défaut Doctrine et l'héritage // Gestion d'un panier
    Bonjour à tous,

    Je vous explique mon problème : j'ai sur l'application WEB que je suis en train de développer une gestion d'achat en ligne. L'utilisateur doit pouvoir souscrire à une offre (un abonnement) et doit pouvoir acheter d'autres produits par la suite.

    Pour se faire je me suis dit que j'allais faire quelque chose de générique, créer une classe "Products" et une classe "Offers" qui en hériterait. Jusque là pas de soucis Doctrine arrive à le gérer et me crée une table "Offers" que je peux remplir sans trop de soucis.

    J'ai maintenant créé un Panier d'achat (une classe "ShoppingCart") dans lequel on peut y mettre des produits (une association ManyToMany entre Products et ShoppingCart).

    Sauf que maintenant je suis confronté au problème suivant, je sais pas si quelqu'un saura m'aider :

    Je veux récupérer le contenu du panier via le getter getProducts qui va lui même récupérer l'ArrayCollection products de l'entité. Il arrive bien à récupérer l'ArrayCollection mais lorsque j'essaye de récupérer le premier élément de la collection via sa fonction get(), j'ai une exception DBAL qui me dit en gros que la table "Products" n'existe pas, ce qui est normal...c’est la table "Offers" qui existe :/

    Voici mes entités :

    Products :

    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
    /**
     * Products
     *
     * @ORM\MappedSuperclass
     */
    class Products
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="creation_date", type="date")
         */
        private $creationDate;
     
        /**
         * @var boolean
         *
         * @ORM\Column(name="available", type="boolean")
         */
        private $available;
     
        /**
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=255)
         */
        private $name;
     
        /**
         * @var string
         *
         * @ORM\Column(name="description", type="text")
         */
        private $description;
     
     
        /**
         * Constructor
         */
        public function __construct()
        {
            $this->creationDate = new \Datetime();
        }
     
    //getters et setters
     
    }
    Offers :

    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
    /**
     * Offers
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="InApps\PassWayBundle\Entity\OffersRepository")
     */
    class Offers extends Products
    {
     
        /**
         * @var float
         *
         * @ORM\Column(name="price", type="float")
         */
        private $price;
     
        /**
         * @var integer
         *
         * @ORM\Column(name="nbShops", type="integer")
         */
        private $nbShops;
     
        /**
         * @var integer
         *
         * @ORM\Column(name="nbModels", type="integer")
         */
        private $nbModels;
     
        /**
         * @var boolean
         *
         * @ORM\Column(name="broadcastMail", type="boolean")
         */
        private $broadcastMail;
     
        /**
         * @var boolean
         *
         * @ORM\Column(name="broadcastMobileApp", type="boolean")
         */
        private $broadcastMobileApp;
     
        /**
         * @var boolean
         *
         * @ORM\Column(name="broadcastSms", type="boolean")
         */
        private $broadcastSms;
     
        /**
         * @var boolean
         *
         * @ORM\Column(name="broadcastSocialNetworks", type="boolean")
         */
        private $broadcastSocialNetworks;
     
        /**
         * @var boolean
         *
         * @ORM\Column(name="broadcastAccessApi", type="boolean")
         */
        private $broadcastAccessApi;
     
        /**
         * @var boolean
         *
         * @ORM\Column(name="accessFidelity", type="boolean")
         */
        private $accessFidelity;
     
    //etc.
     
    }
    ShoppingCart :

    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
    /**
     * ShoppingCart
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="InApps\PassWayBundle\Entity\ShoppingCartRepository")
     *
     * @ORM\HasLifecycleCallbacks
     */
    class ShoppingCart
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var integer
         *
         * @ORM\Column(name="commandNumber", type="integer", nullable=true)
         */
        private $commandNumber;
     
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="creationDate", type="date")
         */
        private $creationDate;
     
        /**
         * @var boolean
         *
         * @ORM\Column(name="cartConfirmed", type="boolean")
         */
        private $cartConfirmed;
     
        /**
         *
         * @ORM\ManyToMany(targetEntity="InApps\PassWayBundle\Entity\Products", cascade={"all"})
         */
        protected $products;
     
        /**
         *
         * @ORM\ManyToOne(targetEntity="InApps\UserBundle\Entity\User", inversedBy="shoppingCarts", cascade={"all"})
         */
        protected $userOwner;
     
     
    //getters et setters
     
    }
    Et la petite fonction de mon contrôleur si ça peut aider :

    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
    public function subscriptionFreeConfirmedAction(){
     
            $user = $this->getUser();
     
            //on récupère l'id du panier en session
            $idPanier = $this->get('request')->getSession()->get('id_panier');
     
            //on récupère le panier
            $panier = $this->getDoctrine()->getRepository('InAppsPassWayBundle:shoppingCart')->find($idPanier);
     
            //on récupère l'offre
            $offerId = $panier->getProducts();
            var_dump($offerId);exit;
     
     
     
        }

    Merci d'avance pour votre aide, si vous avez besoin de plus d'informations n'hésitez pas

  2. #2
    Membre habitué
    Ingénieur d'études et de développement
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur d'études et de développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Points : 154
    Points
    154
    Par défaut
    Tu as créé un héritage de classe simple mais doctrine ignore cet héritage.

    Il faut que tu dises à Doctrine que tes classes héritées sont des entitées héritées.

    Voici le lien vers la doc : http://doctrine-orm.readthedocs.org/...e-mapping.html

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour

    Je suis plutôt étonné que Doctrine accepte cette relation avec une classe abstraite "Product"
    N'y a t'il pas un avertissement dans le profile Symfony, onglet "Doctrine", section "Mapping" ?
    ( ou bien lancer "app/console doctrine:schema:validate")

    Sans doute devrait tu utiliser une autre stratégy d'héritage oû les classes hérités ne produiraients pas chacune une table différentes.
    Revois la doc de Doctrine, Il y a 3 stratégie possibles ("Mapped Superclasses", "Single Table Inheritance" et "Class Table Inheritance").

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 97
    Points : 40
    Points
    40
    Par défaut
    Bonjour à vous,

    En effet je n'ai pas lu la doc jusqu'au bout je me suis rué sur le premier héritage comme un boulet ^^ Je lierais tout ça à tête reposée lorsque je devrais refaire cette partie.

    Merci pour vos précieux conseils, je passe en résolu je posterai un nouveau message si j'ai un soucis lorsque je devrais tout refaire là j'ai été affecté à une autre tâche.

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

Discussions similaires

  1. [2.x] Héritage - Gestion de Personnels
    Par khyor dans le forum Symfony
    Réponses: 2
    Dernier message: 01/12/2011, 15h35
  2. [1.x] gestion d'un panier
    Par snicker dans le forum Symfony
    Réponses: 4
    Dernier message: 01/02/2010, 01h12
  3. [Sécurité] gestion d'un panier
    Par kluck3000 dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2008, 16h40
  4. Gestion d'un panier: session et bouton précédent
    Par renaud26 dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2006, 18h31
  5. tuto sur gestion d'un panier
    Par sam01 dans le forum Langage
    Réponses: 1
    Dernier message: 08/03/2006, 13h39

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