在数据库建模中,表示与附加数据点的多对多关系可能具有挑战性。 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中文网其他相关文章!