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

Doctrine2 PHP Discussion :

ManyToMany Selfreferenced + champ dans table de jonction


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Par défaut ManyToMany Selfreferenced + champ dans table de jonction
    Bonjour,

    je rencontre un souci qui me bloque :

    j'ai une entité A qui peut avoir 0 ou plusieurs pré-requis qui sont eux-mêmes des entités A.

    en gros entité ELEMENTS :

    id
    nom
    prérequis (arrayCollection de ELEMENTS)

    je suis donc dans le cas d'un ManyToMany selfreferenced si j'ai bien compris la doc.
    http://www.doctrine-project.org/docs...lf-referencing

    jusque là ok ça me semble jouable

    mais je voudrais ajouter un champ "quantité" à celui de pré-requis

    et là je sèche, j'ai essayé en créant à la main l'entité de jonction mais ça plante,

    j'ai fait entité A(element) lié à entité B(elementRequis)

    nom de B = relation OnetoMany vers nom de A

    et dans A

    relation ManyToMany vers B

    j'ai une erreur 500 avec comme seul indication array au niveau du persist et je pense que c'est mes relations hors-normes qui plante tout ?

    quelqu'un a t'il une solution pour ajouter un champ à l'assocaition de type :
    http://www.doctrine-project.org/docs...lf-referencing

    merci d'avance

  2. #2
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Je suis pas sûr d'avoir tout compris ^^
    En gros, tu as des objets A qui sont reliés à d'autres objets A. Et sur cette liaison, tu veux ajouter un attribut...

    Pourquoi ne pas créer un objet "Relation" qui encapsulerait un objet A, et ton attribut ?. Chaque objet A possèderaient donc plusieurs objets "Relation".

    Si c'est déjà ce que tu as fait et que tu as eu des erreurs, montre nous donc ce qui plante avec un exemple de code.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Par défaut
    c'est effectivement cette direction que j'ai prise et qui ne marche pas jusqu'au bout :

    mon entité A : (synthétisé)
    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
    <?php
     
    namespace Antiqua\LeJeuBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    /**
     * Antiqua\LeJeuBundle\Entity\ItemCategory
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Antiqua\LeJeuBundle\Entity\ItemCategoryRepository")
     */
    class ItemCategory
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string $nom
         *
         * @ORM\Column(name="nom", type="string", length=255)
         */
        private $nom;
     
    /**
         * @ORM\ManyToMany(targetEntity="CreateItemRequisite")
         */
        protected $createitemrequisite;
     
     
        public function __toString()
        {
            return $this->nom;
        }
        public function __construct()
        {
            $this->createitemrequisite = new \Doctrine\Common\Collections\ArrayCollection();
        }
    mon entité B (jonction)

    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
     
    <?php
     
    namespace Antiqua\LeJeuBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    /**
     * Antiqua\LeJeuBundle\Entity\CreateItemRequisite
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Antiqua\LeJeuBundle\Entity\CreateItemRequisiteRepository")
     */
    class CreateItemRequisite
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @ORM\ManyToOne(targetEntity="ItemCategory")
         */
        protected $itemcategory;
     
        /**
         * @var integer $quantity
         *
         * @ORM\Column(name="quantity", type="integer")
         */
        private $quantity;
    sur cette base j'ai lancé la commande symfony gérez la création des getters, setters

    côté controller, la fonction new, et l'imbrication du formaulaire newB dans newA ça fonctionne, jusqu'au lancement du persist

    le code du 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
    /**
         * Creates a new ItemCategory entity.
         *
         */
        public function createAction()
        {
            $entity  = new ItemCategory();
            $request = $this->getRequest();
            $form    = $this->createForm(new ItemCategoryType(), $entity);
            $form->bindRequest($request);
            $entity->setCreatedAt(new \Datetime());
     
            if ($form->isValid()) {
                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($entity);
                foreach($entity->getCreateitemrequisite() as $createitemrequisite)
                {
                    $em->persist($createitemrequisite);
                }
                $em->flush();
     
                return $this->redirect($this->generateUrl('admin_itemcategory_show', array('id' => $entity->getId())));
     
            }
     
            return $this->render('AntiquaLeJeuBundle:ItemCategory:new.html.twig', array(
                'entity' => $entity,
                'form'   => $form->createView()
            ));
        }
    et enfin ce que ça donne quand je valide le formulaire qui lance la fonction ci-dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    array
    500 Internal Server Error - InvalidArgumentException
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function persist($entity)
        {
            if ( ! is_object($entity)) {
                throw new \InvalidArgumentException(gettype($entity));
            }
            $this->errorIfClosed();
            $this->unitOfWork->persist($entity);
    merci en tout cas de s'intéresser à mon souci ;-)

  4. #4
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Je connais pas le framework que tu utilises... (désolé :S). Et là je peux trop savoir ce qui plante avec le code que tu donnes, car il n'y aura jamais tout.

    Face à ce genre de problème et à défaut d'autre chose, la meilleure chose à faire est sans doute de déboguer. Si tu utilises un environnement de développement (NetBeans, Eclipse), alors met des points d'arrêt là ou il faut et regarde ce qui se passe. Sinon, reste la technique des var_dump()...
    Qu'y a-t-il dans la variable $entity qui semble être la cause de ton exception ?
    Où a-t-elle été initialisée etc...

    C'est pas évident, mais à ce jeu là, on y apprend toujours (beaucoup plus que si quelqu'un te donne la solution direct en tout cas).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Par défaut
    Merci, il s'agit de symfony2 tout simplement le frère de doctrine2 ;-)

    le souci avec Doctrine c'est que j'ai parfois l'impression de devoir oublié ce que j'ai appris sur les bdd relationelles, alors qu'il sesné faciliter la vie ;-)

    j'ai trouvé un cookbook complémentaire qui pourrait être une solution mais cela n'est pas présenté dans le cadre d'une relation ManyToMany

    http://www.doctrine-project.org/docs...-with-metadata

    du coup ça me laisse dubitatif, surtout que mon anglais n'est pas haut de gamme, ni ma connaissance poo php, du coup j'ai peur de mal saisir certains concepts simples pour beaucoup d'autres mais c'est pas grave j'y arriverai ;-)

    en bdd relationnel, j'avais une table typeItem qui était lié [o,n] vers une table itemRequis [1.1] et inversement une relation [1.1] vers [0.n] de itemRequis vers typeItem

    trasnposer ça sous doctrine semble plus complexe que en l'était le schema initial ;-)

Discussions similaires

  1. modifier type de champs dans table de base access 2000
    Par raoulv dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 12/03/2007, 14h22
  2. Supprimer champ dans table maître avec tous détails clients
    Par dj_techno dans le forum Bases de données
    Réponses: 35
    Dernier message: 15/02/2007, 15h40
  3. comment formater un champs dans table mysql
    Par rollly dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 24/04/2006, 14h31
  4. ajout champ dans table et formulaire
    Par moufflon dans le forum IHM
    Réponses: 1
    Dernier message: 15/02/2006, 12h01
  5. Commande Update... vider certains champ dans table.
    Par angelevil dans le forum ASP
    Réponses: 3
    Dernier message: 04/05/2005, 21h08

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