Maison  >  Article  >  développement back-end  >  Comment modéliser des relations plusieurs-à-plusieurs avec des données supplémentaires à l'aide de Doctrine 2 ?

Comment modéliser des relations plusieurs-à-plusieurs avec des données supplémentaires à l'aide de Doctrine 2 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-25 07:25:29201parcourir

How to Model Many-to-Many Relationships with Additional Data Using Doctrine 2?

Doctrine 2 et table de liens plusieurs-à-plusieurs avec champ supplémentaire

Dans la modélisation de bases de données, représenter des relations plusieurs-à-plusieurs avec des points de données supplémentaires peut être difficile. Doctrine 2, un ORM PHP populaire, propose une solution en incorporant une technique connue sous le nom de « tables de liens ». Ces tables servent d'intermédiaires entre les entités, facilitant les associations tout en capturant des informations supplémentaires.

Considérez le scénario suivant : vous souhaitez créer un modèle de base de données avec une relation plusieurs-à-plusieurs entre les magasins et les produits. Cependant, chaque lien entre un magasin et un produit doit également inclure une valeur supplémentaire, comme la quantité de stock disponible.

Modèle de base de données

Au départ, vous auriez peut-être envisagé d'utiliser un modèle de base de données -nombreuses relations avec un champ supplémentaire directement dans la table des liens. Cependant, Doctrine 2 reconnaît qu'une telle association n'est pas vraiment une relation plusieurs-à-plusieurs mais plutôt une nouvelle entité avec son propre identifiant.

Solution : Entité de stock séparée

Pour résoudre ce problème , il est recommandé de créer une entité distincte pour les informations de stock, comme le montre le modèle de base de données ci-dessous :

[Image du modèle de base de données avec une entité de stock distincte]

Entités

Produit :

<code class="php">namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Table(name="product") @ORM\Entity() */
class Product
{
    /** @ORM\Id() @ORM\Column(type="integer") */
    protected $id;

    /** ORM\Column(name="product_name", type="string", length=50, nullable=false) */
    protected $name;

    /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="product") */
    protected $stockProducts;
}</code>

Magasin :

<code class="php">namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Table(name="store") @ORM\Entity() */
class Store
{
    /** @ORM\Id() @ORM\Column(type="integer") */
    protected $id;

    /** ORM\Column(name="store_name", type="string", length=50, nullable=false) */
    protected $name;

    /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="store") */
    protected $stockProducts;
}</code>

Stock :

<code class="php">namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Table(name="stock") @ORM\Entity() */
class Stock
{
    /** ORM\Column(type="integer") */
    protected $amount;

    /** 
     * @ORM\Id()
     * @ORM\ManyToOne(targetEntity="Entity\Store", inversedBy="stockProducts") 
     * @ORM\JoinColumn(name="store_id", referencedColumnName="id", nullable=false) 
     */
    protected $store;

    /** 
     * @ORM\Id()
     * @ORM\ManyToOne(targetEntity="Entity\Product", inversedBy="stockProducts") 
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false) 
     */
    protected $product;
}</code>

En mettant en œuvre cette approche, vous pouvez désormais accéder facilement à la valeur du montant du stock via l'entité Stock et maintenir l'intégrité de votre modèle de données dans Doctrine 2.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn