web-dev-qa-db-fra.com

Doctrine 2: Comment gérer les tables de jointure avec des colonnes supplémentaires

Comment configurer une table de jointure avec des colonnes supplémentaires, ou une association plusieurs à plusieurs avec des propriétés supplémentaires, dans Doctrine 2?

23
Jasper N. Brouwer

Tout d'abord, laissez-moi vous expliquer que cela n'existe pas :

A join table (également connu sous le nom table de jonction ou table de références croisées) est une table qui relie 2 ( ou plus) d'autres tables ensemble dans la même base de données par clé primaire. Cela signifie qu'une table de jointure ne contiendra que des clés étrangères, il n'y a pas de place pour ces colonnes supplémentaires.

Ainsi, lorsque vous avez besoin de colonnes supplémentaires dans une telle table, ce n'est plus seulement un "lien" entre d'autres tables, mais devient une vraie table à part entière!

En termes de Doctrine 2, vous n'avez plus d'association plusieurs-à-plusieurs entre 2 entités, mais obtenez une association un-à-plusieurs/plusieurs-à-un entre 3 entités.

Continuez à lire ici pour plus de détails explications:

61
Jasper N. Brouwer

Dans le deuxième article, je propose une mise à jour mineure. Au lieu de l'événement complet, utilisez un LifecycleCallback dans l'entité elle-même:

/**
 * @ORM\Entity
 * @ORM\Table(name="jobs”)
 * @ORM\HasLifecycleCallbacks
 */
class Job
{
    // ...

    /**
     * @ORM\PreRemove
     */
    public function preRemoveCallback()
    {
        $this->setPerson(null);
        $this->setCompany(null);
    }
}
1
craigh