Maison >base de données >tutoriel mysql >Comment gérer les relations plusieurs-à-plusieurs avec des champs supplémentaires dans Doctrine 2 ?
Clarification de la requête
Dans le Question initiale, l'utilisateur a demandé des conseils sur la création d'une relation plusieurs-à-plusieurs dans une table de liens contenant un champ supplémentaire (montant du stock). Le défi s'est posé lors de l'accès à la valeur du montant du stock à l'aide de Doctrine et de la génération de la structure de la table de base de données.
Résoudre le problème
Le problème provenait de l'hypothèse selon laquelle un système à plusieurs -de nombreuses relations avec des valeurs supplémentaires pourraient être traitées comme telles. Cependant, une relation plusieurs-à-plusieurs avec des valeurs supplémentaires devient une nouvelle entité avec un identifiant et des valeurs.
Solution
La solution impliquait la création d'une entité distincte appelée Stock avec les colonnes suivantes :
Cela a permis au système de modéliser la relation plusieurs-à-plusieurs avec précision, donnant accès à la valeur du montant du stock à l'aide de Doctrine.
Entités mises à jour
Vous trouverez ci-dessous l'entité ajustée définitions :
Produit :
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; }
Magasin :
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; }
Stock :
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; }
Base de données Structure
Ce changement a abouti à la structure de la base de données présentée ci-dessous :
CREATE TABLE product ( id INT NOT NULL, product_name VARCHAR(50) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE store ( id INT NOT NULL, store_name VARCHAR(50) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE stock ( amount INT NOT NULL, store_id INT NOT NULL, product_id INT NOT NULL, PRIMARY KEY (store_id, product_id), FOREIGN KEY (store_id) REFERENCES store (id), FOREIGN KEY (product_id) REFERENCES product (id) );
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!