Maison > base de données > tutoriel mysql > Comment gérer les relations plusieurs-à-plusieurs avec des champs supplémentaires dans Doctrine 2 ?

Comment gérer les relations plusieurs-à-plusieurs avec des champs supplémentaires dans Doctrine 2 ?

Patricia Arquette
Libérer: 2024-12-22 01:55:11
original
842 Les gens l'ont consulté

How to Handle Many-to-Many Relationships with Extra Fields in Doctrine 2?

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

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 :

  • Montant (pour stocker la valeur du stock)
  • Relations avec le produit et le magasin entités

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

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

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

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

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 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