Maison > développement back-end > tutoriel php > 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
Libérer: 2024-10-25 07:25:29
original
302 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal