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
Patricia Arquetteoriginal
2024-12-22 01:55:11775parcourir

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

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!

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