Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Doctrine2] Héritage simple entre 2 classes(tables)

    17 décembre 2011 à 16:32:00

    Bonjour,

    je débute dans Doctrine (que j'utilise avec ZF). Je possède une classe "Contenu", qui possède plusieurs attributs comme "titre, contenu, date_publication, etc..."

    Ainsi qu'une classe "News" qui possède comme seul attribut "valide". Je souhaite que "News" hérite de "Contenu".

    Sur mon application, j'aurais donc des "Contenu" qui correspondent à des pages "statiques". Puis des "News".

    Même si ce n'est pas vraiment mon problème, vous allez me dire "Pourquoi pas faire une seule classe?". Non, car par la suite, je souhaite mettre un place des "Commentaires", qui seront liés à des "News", et non pas des pages statiques ("Contenu").

    Puis ca me permet de m’entraîner et mieux comprendre Doctrine ;)

    -----

    J'ai essayé de suivre la doc Doctrine 2, et voici mon code :

    Classe Contenu:

    <?php
    
    namespace Entities;
    
    /**
     *
     * @Entity()
     * @Table(name="Contenu")
     * @InheritanceType("JOINED")
     * @DiscriminatorMap({"news" = "News"})
     */
    
    class Contenu {
        /**
         * @Id @Column(type="integer")
         * @GeneratedValue(strategy="AUTO")
         */
        private $id;
        
        /** @Column(type="datetime") */
        private $datePublication;
        /** @Column(type="string") */
        private $titre;
        /** @Column(type="text") */
        private $contenu;
    


    Puis ma classe News

    <?php
    
    namespace Entities;
    
    /**
     *
     * @Entity()
     * @Table(name="News")
     */
    class News extends Contenu {
        /**
         * @Id @Column(type="integer")
         * @GeneratedValue(strategy="AUTO")
         */
        private $id;
        
        /** @Column(type="boolean") */
        private $valide;
    



    En fait, mon code fonctionne parfaitement. Ma question est : Est-ce que j'utilise la bonne méthode pour faire un héritage simple ?

    Car au niveau du SGBD, ma table "News" possède un attribut "id" qui n'est pas une clé primaire, mais un foreign key vers l'id de la table "Contenu".
    Perso, j'aurais plutôt mis "id_contenu" en foreign key, puis "id" en primary key.. :\

    Puis dans la table "Contenu", j'ai un champs "dtype" aussi. Je ne sais pas à quoi il sert.


    En espérant trouver réponse à mes questions,

    Bonne soirée ;)

    • Partager sur Facebook
    • Partager sur Twitter
      17 décembre 2011 à 18:31:51

      > Car au niveau du SGBD, ma table "News" possède un attribut "id"
      > qui n'est pas une clé primaire, mais un foreign key vers l'id de
      > la table "Contenu".

      C'est une des façons de faire de l'héritage.

      Naturellement, comme chaque ligne de la table news correspond à une seule et unique ligne de la table contenu, news.id est clé primaire de news (ou au moins UNIQUE NOT NULL, ce qui revient au même).

      > Perso, j'aurais plutôt mis "id_contenu" en foreign key, puis "id" en primary key.. :\

      2 clés primaires sur une même table ?...
      • Partager sur Facebook
      • Partager sur Twitter
        17 décembre 2011 à 19:36:39

        > 2 clés primaires sur une même table ?...

        Non, une clé primaire "id". Puis une clé étrangère "id_contenu" vers Contenu.id. Qui a pour rôle de faire l'héritage.
        • Partager sur Facebook
        • Partager sur Twitter
          17 décembre 2011 à 19:50:20

          dans ce cas "id" ne sert à rien puisque tu as déjà une clé primaire id_contenu...
          • Partager sur Facebook
          • Partager sur Twitter
            20 décembre 2011 à 23:42:27

            Oui c'est juste une méthode que je n'avais pas l'habitude de voir.

            Petit question concernant l'héritage et le DQL.
            Je souhaite obtenir tout les "Contenu" qui ne sont pas des "News".

            Voici normalement la requete DQL :

            $em = $this->getEntityManager();
                    $query = $em->createQuery("SELECT u FROM \Entities\Contenu u WHERE u NOT INSTANCE OF \Entities\News");
            


            Et voici le message d'erreur que j'obtiens :
            Notice: Undefined index: \Entities\News in ****\library\Doctrine\ORM\Query\SqlWalker.php on line 1597


            J'ai du mal à comprendre d'où vient l'erreur, puisque j'ai pris le même exemple que sur la doc... :s
            • Partager sur Facebook
            • Partager sur Twitter

            [Doctrine2] Héritage simple entre 2 classes(tables)

            × 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