在資料庫建模中,表示與附加資料點的多對多關係可能具有挑戰性。 Doctrine 2 是一種流行的 PHP ORM,它透過結合稱為「連結表」的技術提供了解決方案。這些表充當實體之間的中介,在捕獲附加資訊的同時促進關聯。
考慮以下場景:您想要建立一個在商店和產品之間具有多對多關係的資料庫模型。但是,商店和產品之間的每個連結也應該包含一個附加價值,例如可用庫存數量。
最初,您可能會考慮使用多對多- 直接在連結表中使用額外欄位的許多關係。然而,原則 2 認識到這樣的關聯並不是真正的多對多關係,而是一個具有自己識別碼的新實體。
解決此問題,建議為股票資訊建立一個單獨的實體,如下面的資料庫模型所示:
[具有單獨股票實體的數據庫模型的圖像]
產品:
<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>
商店:
<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>
庫存:
<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>
透過實作此方法,您現在可以透過Stock 實體輕鬆存取股票金額值,並維護Doctrine 2 中資料模型的完整性。
以上是如何使用 Dotrine 2 建模具有附加資料的多對多關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!