Heim  >  Artikel  >  Backend-Entwicklung  >  Wie modelliert man Viele-zu-Viele-Beziehungen mit zusätzlichen Daten mithilfe von Doktrin 2?

Wie modelliert man Viele-zu-Viele-Beziehungen mit zusätzlichen Daten mithilfe von Doktrin 2?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-25 07:25:29201Durchsuche

How to Model Many-to-Many Relationships with Additional Data Using Doctrine 2?

Doktrin 2 und Viele-zu-viele-Verknüpfungstabelle mit zusätzlichem Feld

Bei der Datenbankmodellierung kann die Darstellung von Viele-zu-viele-Beziehungen mit zusätzlichen Datenpunkten eine Herausforderung sein. Doctrine 2, ein beliebtes PHP-ORM, bietet eine Lösung, indem es eine Technik integriert, die als „Link-Tabellen“ bekannt ist. Diese Tabellen dienen als Vermittler zwischen Entitäten, erleichtern Zuordnungen und erfassen gleichzeitig zusätzliche Informationen.

Stellen Sie sich das folgende Szenario vor: Sie möchten ein Datenbankmodell mit einer Viele-zu-Viele-Beziehung zwischen Geschäften und Produkten erstellen. Allerdings sollte jede Verknüpfung zwischen einem Geschäft und einem Produkt auch einen zusätzlichen Wert enthalten, beispielsweise die Menge des verfügbaren Lagerbestands.

Datenbankmodell

Zunächst hätten Sie vielleicht über die Verwendung eines Many-to nachgedacht -many-Beziehung mit einem zusätzlichen Feld direkt in der Verknüpfungstabelle. Doktrin 2 erkennt jedoch an, dass es sich bei einer solchen Assoziation nicht wirklich um eine Viele-zu-Viele-Beziehung handelt, sondern vielmehr um eine neue Entität mit einer eigenen Kennung.

Lösung: Separate Aktieneinheit

Um dieses Problem zu beheben , wird empfohlen, eine separate Entität für die Bestandsinformationen zu erstellen, wie im Datenbankmodell unten zu sehen:

[Bild des Datenbankmodells mit separater Bestandsentität]

Entitäten

Produkt:

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

Shop:

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

Lagerbestand:

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

Durch die Implementierung dieses Ansatzes können Sie jetzt einfach über die Entität „Stock“ auf den Bestandswert zugreifen und die Integrität Ihres Datenmodells in Doktrin 2 aufrechterhalten.

Das obige ist der detaillierte Inhalt vonWie modelliert man Viele-zu-Viele-Beziehungen mit zusätzlichen Daten mithilfe von Doktrin 2?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn