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 :

Table intermédiaire API


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Avril 2016
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Avril 2016
    Messages : 108
    Par défaut Table intermédiaire API
    Bonjour,

    Je suis bloqué sur une table intermédiaire pour la création d'une API , l'idée etant que j'ai une table Product qui a des suppléments ( ou pas ) qui sont eux meme des Product.
    J'ai fait un table intermédiaire SuppProduit car une manyToMany self reference ne me permettais pas d'ajouter une colonne supplémentaire newPrice afin de crée des menus.
    Une frite pouvant etre un produit principal par exemple a 4 euros, si je la lie a un hamburger je voudrais gérer un nouveau prix de 3euros par exemple, ou de 2euros si je la lie avec un poulet.
    Donc j'ai bien une table du style : id | id_product | id_supp | newPrice

    L'idée serait que quand je tape sur l'url du style /product/{id_product} je me retrouve donc avec :
    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
    {
        "id": 1,
        "name": "Le special",
        "description": "Pain burger, sauce, tartare de légumes, salade fraîche, poulet rôti du Sud-ouest",
        "price": "595",
        "is_supp": false,
        "category": {
            "id": 1,
            "name": "Burger",
            "url_image": "image/burger_test.jpg"
        },
        "supplements": [
            {
            }
         ]
    }
    Avec la liste de produit lié comme supplément.
    Et c'est la ou je galere, pour l'instant je suis arrivé à mettre en base dans ma table SuppProduct mais je n'arrive pas à ressortir les infos correctement, je pense aussi que mon serialisation.yml n'est pas correct et je m'y perds.

    Mon 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     /**
         * @Rest\View(statusCode=Response::HTTP_CREATED,serializerGroups={"product"})
         * @Rest\Post("/categories/{categories_id}/products/{product_id}/supplements_product")
         */
        public function postSuppProductionAction(Request $request){
     
     
            // On recupere une instance du produit
            $product = $this->getDoctrine()->getRepository(Product::class)
                            ->find($request->get('product_id'));
     
            // on recupere une instance du supp ( produit )
            $supp =  $this->getDoctrine()->getRepository(Product::class)
                ->find($request->get('supplements'));
     
            if (empty($product) || empty($supp)){
                return ProductController::productNotFound();
            }
     
    //        création de l'instance SuppProduct
            $suppList = new SupplementProduct();
     
            $suppList->setProducts($product)->setSupplements($supp)
                ->setNewPrice($request->get('newPrice'));
     
     
            $form = $this->createForm(SupplementProductType::class,$suppList);
     
            $form->submit($request->request->all());
     
    //        $product->addSupplement($supp);
     
            if ($form->isValid()){
                $em = $this->getDoctrine()->getManager();
                $em->persist($suppList);
                $em->flush();
     
     
                return $suppList;
            }else{
                return $form;
            }
     
        }
    Ainsi que mon fichier serialization.yml :
    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
    AppBundle\Entity\Category:
       attributes:
          id:
             groups: ['category','product']
          name:
             groups: ['category','product']
          url_image:
             groups: ['category','product']
          products:
             groups: ['category']
     
     
    AppBundle\Entity\Product:
       attributes:
          id:
             groups: ['product','category']
          name:
             groups: ['product','category']
          description:
             groups: ['product','category']
          price:
             groups: ['product','category']
          is_supp:
             groups: ['product','category']
          category:
             groups: ['product']
          supplements:
            groups:  ['product','supplement']
     
    AppBundle\Entity\SupplementProduct:
       attributes:
          id:
             groups: ['product','supplement']
          products:
             groups: ['product']
          supplements:
             groups: ['product']
          newPrice:
             groups: ['product']
    Merci à celui qui pourra m'avancer je bloque completement la dessus et commence un peu à m'embrouiller.

    Cordialement,

  2. #2
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Avril 2016
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Avril 2016
    Messages : 108
    Par défaut
    Up ...

    J'arrive à recuperer assez proprement mes list de suppléments via products/product_id/supp_product

    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
    [
        {
            "supplements": {
                "id": 8,
                "name": "Frites",
                "description": null,
                "price": "395",
                "is_supp": true
            },
            "newPrice": "295"
        },
        {
            "supplements": {
                "id": 9,
                "name": "Pomme de terre maison",
                "description": null,
                "price": "395",
                "is_supp": true
            },
            "newPrice": "295"
        }
    ]
    Mais par contre je galere a retrouver ce meme type de list sur mes products, pour l'instant mon controller a la recupération d'un product ressemble a ca :

    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
     /**
         * @Rest\View(serializerGroups={"product"})
         * @Rest\Get("/categories/{categories_id}/products/{product_id}")
         */
        public function getProductAction(Request $request){
     
    //        On recupere le produit grace à son id et celui de la categorie
        $product = $this->getDoctrine()->getRepository(Product::class)
                        ->findOneBy([
                            "category" => $request->get('categories_id'),
                            "id" => $request->get('product_id')
                        ]);
    //      On recupere la liste de supplément du produit
         $listSupp = $this->getDoctrine()->getRepository(SupplementProduct::class)
            ->findBy([
                "products" =>$product->getId(),
     
            ]);
    //    dump($listSupp);die();
     
    //      Verif product
            if (empty($product)){
                return $this->productNotFound();
            };
    //      Boucle pour ajouter chaque supplement de la liste au produit
            foreach ( $listSupp as $supp){
                if ($listSupp != null){
                    $product->addSupplement($supp->getSupplements());
     
                }
            }
     
     
     
    //        dump($product);die();
     
            return $product;
        }
    Mais je recupere en Json une liste de supplément avec de suppléments à l'intérieur...
    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
    {
        "id": 1,
        "name": "Le special",
        "description": "Pain burger, sauce, tartare de légumes, salade fraîche, poulet rôti du Sud-ouest",
        "price": "595",
        "is_supp": false,
        "supplements": [
            {
                "id": 8,
                "name": "Frites",
                "description": null,
                "price": "395",
                "is_supp": true,
                "supplements": [
                    {
                        "id": 1,
                        "newPrice": "295"
                    }
                ]
            },
            {
                "id": 9,
                "name": "Pomme de terre maison",
                "description": null,
                "price": "395",
                "is_supp": true,
                "supplements": [
                    {
                        "id": 19,
                        "newPrice": "295"
                    }
                ]
            }
        ]
    }
    Quelqu'un pourrait il m'aiguiller ? la façon de faire n'est peut etre pas le bonne ? Comment arriver a récuperer une liste de supplément propre grace à ma table d'association ??

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Par défaut
    Ca semble correcte ce que tu fais
    montre un peu tes entités

  4. #4
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Avril 2016
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Avril 2016
    Messages : 108
    Par défaut
    Mon entité Product :

    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
     
    /**
     * Class Product
     * @ORM\Entity()
     * @ORM\Table(name="products",
     *      uniqueConstraints={@ORM\UniqueConstraint(name="products_name_unique",columns={"name"})})
     */
    class Product
    {
        /**
         * @ORM\Id()
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue()
         */
        private $id;
     
        /**
         * @ORM\Column(type="string")
         */
        private $name;
     
        /**
         * @ORM\Column(type="string",nullable=true)
         */
        private $description;
     
     
        /**
         * @ORM\Column(type="bigint")
         */
        private $price;
     
        /**
         * @ORM\Column(type="boolean")
         */
        private $isSupp;
     
     
        /**
         * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category",inversedBy="products")
         */
        private $category;
     
     
        /**
         * @ORM\OneToMany(targetEntity="AppBundle\Entity\SupplementProduct",mappedBy="products")
         */
        private $products;
     
     
        /**
         * @ORM\OneToMany(targetEntity="AppBundle\Entity\SupplementProduct",mappedBy="supplements")
         */
        private $supplements;
    Ainsi que mon entité SuppProduit :

    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
    /**
     * Class SupplementProduct
     * @ORM\Entity()
     * @ORM\Table(name="supplement_product")
     * 
     */
    class SupplementProduct
    {
     
        /**
         * @ORM\Id()
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue()
         */
        private $id;
     
     
        /**
         * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Product",inversedBy="products")
         * @ORM\JoinColumn(name="product_id", referencedColumnName="id",nullable=false)
         */
        private $products;
     
     
        /**
         * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Product",inversedBy="supplements")
         * @ORM\JoinColumn(name="supplement_id", referencedColumnName="id",nullable=false)
         */
        private $supplements;
     
     
        /**
         * @ORM\Column(type="bigint",nullable=true)
         */
        private $newPrice;

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/03/2008, 08h30
  2. Requête avec table intermédiaire
    Par jgfa9 dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/03/2007, 18h51
  3. Réponses: 2
    Dernier message: 02/08/2006, 10h25
  4. Index ou table intermédiaire ?
    Par n00bi dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 02/06/2006, 11h07
  5. Réponses: 13
    Dernier message: 14/09/2005, 16h21

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