Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 3.4 clé composée

    21 septembre 2018 à 16:19:54

    Bonjour,

    j'ai une entity categorie composée d'un id, d'un libelle.

    j'ai aussi une entity sous-categorie composée d'un id, d'un libelle et de l'entity categorie en ManyToOne.

    Le libelle d'une sous-categorie n'est pas unique.

    En effet, il doit pouvoir y avoir la sous-categorie A pour la categorie 1 et pour la categorie 2.

    Par contre je souhaiterai que la sous-categorie A ne puisse pas être présent 2 fois dans la categorie 1.

    Si j'intervenais sur mysql directement, je pense que je composerai la clé primaire sur le couple libelle + id_categorie, sauf que je ne sais pas le faire avec doctrine.

    Sauriez vous m'indiquer ou chercher svp?

    merci par avance.

    • Partager sur Facebook
    • Partager sur Twitter
      21 septembre 2018 à 16:33:39

      Bonjour,

      Je pense que le problème est la représentation de la hiérarchie de tes catégories. Si une sous-catégorie ne peux pas être deux fois dans une catégorie, c'est que tu veux en fait faire une sur-catégorie, non?

      Auquel cas, il suffit d'inverser la relation en OneToMany ou de faire une ManyToOne de catégorie à sur catégorie.

      A moins que je n'aie pas bien compris ton besoin fonctionnel!

      A toi

      • Partager sur Facebook
      • Partager sur Twitter
        21 septembre 2018 à 16:38:45

        Merci pour ta réponse rapide,

        avec un exemple concret:

        la catégorie FILM peut contenir la sous catégorie Horreur

        la catégorie Serie peut contenir la sous catégorie Horreur aussi.

        J'ai pensé à inverser et stocker l'info depuis horreur en disant que la catégorie Horreur à les sous catégorie film et série, mais c'est une exception.

        et j'ai besoin de retrouver les sous categorie de film et de série, je n'ai par contre pas besoin de retrouver si dans horreur j'ai des series et des films.

        • Partager sur Facebook
        • Partager sur Twitter
          21 septembre 2018 à 17:47:30

          Salut !

          Premier point : Doctrine n'a officiellement supporté les clés primaires composites avec une clé étrangère que dans sa version 2.1, ce qui correspond à Symfony 2.0. Il n'y a pas vraiment d'autre alternative que d'avoir une clé primaire "simple" et de mettre des contraintes soit avec les indexes dans les mappings, soit si c'est possible selon ton besoin avec une contrainte UniqueEntity.

          Maintenant, si je comprends bien ton cas, tu souhaites que Horreur soit subordonnée à Film et à Série, et pas avoir deux fois Horreur dans tes sous-catégories ? Si c'est bien ça, alors la relation me semble être une ManyToMany : une sous-catégorie peut avoir plusieurs parents directs, et un parent a très probablement plusieurs enfants directs.

          Edit

          La fonctionnalité de clé primaire avec clé étrangère a été réintroduite avec la version 2.8 de l'ORM

          -
          Edité par Ymox 25 juin 2021 à 17:03:49

          • Partager sur Facebook
          • Partager sur Twitter
            21 septembre 2018 à 17:51:38

            Merci pour ta réponse.

            je souhaite bien avoir un ManyToOne et avoir 2 fois le même libellé horreur, dans 2 sous categories différentes.

            l'exemple des films n'est qu'un exemple pour comprendre. dans mes sous categorie, certes le libelle est le même mais le reste de l'entity est différent.

            bref, je vais me pencher sur UniqueEntity merci

            • Partager sur Facebook
            • Partager sur Twitter
              21 septembre 2018 à 18:05:31

              Si tu as simplement une catégorie peut avoir plusieurs enfants et un enfant un seul parent, Doctrine se charge automatiquement de ne pas générer de doublon de liaison — sauf si tu créés explicitement deux sous-catégories avec les mêmes données. Etant donné que normalement on créé un enfant après avoir créé le parent et que — c'est relativement paradoxal, mais c'est bien ça en informatique  :D — on choisit le parent pour l'enfant, c'est le seul risque que je vois. Au pire, UniqueEntity appliqué sur les champs critiques devrait faire l'affaire.

              Si à l'inverse tu souhaites créer un parent et lui donner des enfants tout de suite (collection de sous-catégories), cela relève de ta responsabilité de vérifier que ce que tu envoies est unique. UniqueEntity se base sur le contenu de la base de données à un certain moment, mais ne regarde pas si un lot de nouvelles entités sont uniques entre elles, vu qu'elles ne sont pas encore persistées.

              Et récemment, j'ai même eu des cas de doublons pour des insertions effectuées à 7 secondes d'intervalle — probablement quelqu'un qui a cliqué deux fois sur le bouton de soumission — mais ça n'explique pas complètement le fait qu'en 7 secondes les premières données n'aient pas été prises en compte.

              -
              Edité par Ymox 21 septembre 2018 à 18:07:08

              • Partager sur Facebook
              • Partager sur Twitter
                24 septembre 2018 à 8:52:03

                Bonjour et merci.

                j'ai 1 enfant qui a plusieurs parent et un parent à plusieurs enfants.

                je vais gérer à la mano, merci

                • Partager sur Facebook
                • Partager sur Twitter

                Symfony 3.4 clé composée

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown