Doctrine Exemple d'héritage de table

Dans un précédent billet, nous avons défini simplement ce qu'est l'héritage en PHP, ici nous allons aller un peu plus loin !!

Qu'est ce que l'héritage de tables (ou d'entités) via Doctrine ?

Doctrine est un ORM (pour Mappeur Relationnel d'Objets), qui permet de définir et de lier nos entités (classes) afin de construire notre base de données, indépendemment du système de gestion choisi.

C'est à dire que nous utilisons un système de classes (comme montré dans l'article précédent) afin de décrire la structure de la base de données.

Imaginons que nous voudrions référencer un ensemble fini d'actions à réaliser sur certaines tables existantes, comme s'abonner, se désabonner, lire...

Par exemple, voici la définition d'une entité "Actions" (mère) via Doctrine :

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({"abonner" = "Abonner", "partager" = "Partager"})
 */
abstract class Actions
{
    /**
     * @Id @GeneratedValue @Column(type="integer")
     * @var int
     */
    protected $id;

    public function getId()
    {
        return $this->id;
    }

    /**
     * @var \AppBundle\Entity\User
     */
    private $author;

    /**
     * Set author
     *
     * @param \AppBundle\Entity\User $author
     *
     * @return Action
     */
    public function setAuthor(\AppBundle\Entity\User $author = null)
    {
        $this->author = $author;

        return $this;
    }

    /**
     * Get author
     *
     * @return \AppBundle\Entity\User
     */
    public function getAuthor()
    {
        return $this->author;
    }
}

Et bien, la aussi, nous pouvons utiliser la méthodologie de l'héritage de classe, afin que certaines propriétés ou méthodes soient héritées dans la classe fille, ou bien de spécialiser certaines méthodes de la classe fille.

/**
 * @Entity @Table(name="Abonner")
 */
class Abonner extends Actions
{
    /**
     * @var \AppBundle\Entity\Source
     */
    private $source;

    /**
     * Set source
     *
     * @param \AppBundle\Entity\Source $source
     *
     * @return Action
     */
    public function setSource(\AppBundle\Entity\Source $source = null)
    {
        $this->source = $source;

        return $this;
    }

    /**
     * Get source
     *
     * @return \AppBundle\Entity\Source
     */
    public function getSource()
    {
        return $this->source;
    }
}
/**
 * @Entity @Table(name="partager")
 */
class Partager extends Actions
{
    /**
     * @var \AppBundle\Entity\Post
     */
    private $post;

    /**
     * @var \AppBundle\Entity\Cercle
     */
    private $cercle;

    /**
     * Set post
     *
     * @param \AppBundle\Entity\Post $post
     *
     * @return Action
     */
    public function setPost(\AppBundle\Entity\Post $post = null)
    {
        $this->post = $post;

        return $this;
    }

    /**
     * Get post
     *
     * @return \AppBundle\Entity\Post
     */
    public function getPost()
    {
        return $this->post;
    }

    /**
     * Set cercle
     *
     * @param \AppBundle\Entity\Cercle $cercle
     *
     * @return Action
     */
    public function setCercle(\AppBundle\Entity\Cercle $cercle = null)
    {
        $this->cercle = $cercle;

        return $this;
    }

    /**
     * Get cercle
     *
     * @return \AppBundle\Entity\Cercle
     */
    public function getCercle()
    {
        return $this->cercle;
    }
}

Nous avons bien réalisé un héritage d'entitiés.

Mais que ce passe-t-il au niveau de la base de données, quand nous réalisons ce type d'héritage ?

Doctrine va nous générer un table unique, dans laquelle elle va stocker toutes les relations attenantes à nos entités déclarées.

A très bientôt,

Weenesta