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.
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.
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]
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!